gpt4 book ai didi

ffmpeg - 使用 libavformat 重新混合时,开始时间戳不为零

转载 作者:行者123 更新时间:2023-12-04 22:45:04 30 4
gpt4 key购买 nike

我正在使用 libavformat 的示例 remuxing.c 重新混合实时 rtmp 流我的代码与该示例几乎相同,但它还解码音频和视频,以便使用 SDL 呈现预览,效果很好。

我的应用程序有一个开始录制的按钮,每当用户按下它时,主循环都会重新混合到一个文件中,在典型情况下,用户会在开始录制之前等待几秒钟,这就是问题出现的地方,生成的视频具有非零开始时间。 (如果我在打开输入流后立即手动启动录制,我看不到这些问题)

例如
用户在开始录制前等待 5 秒,然后录制 5 秒:报告的持续时间约为 5 秒,而开始时间戳约为 9 秒。 VLC 无法正确显示持续时间/位置,但在其他播放器中运行良好。

这是我的主循环的一个例子

while (1) {
ret = av_read_frame(ifmt_ctx, &pkt);

//decode and preview
//set pts, dts and duration
//...

if(ost->record){
//remux
ret = av_interleaved_write_frame(ofmt_ctx, &pkt);
if (ret < 0) {
fprintf(stderr, "Error muxing packet\n");
break;
}
}

av_packet_unref(&pkt);
}

我试过设置输入流的 mux_ts_offset ,但没有帮助。

最佳答案

您获得的 tps 与您连接到流的时刻有关。当您开始记录您时,记住第一个数据包的 tps 和 dps,然后将所有内容都移动该偏移量。

first_packet = true;
while (1) {
ret = av_read_frame(ifmt_ctx, &pkt);

//decode and preview
//set pts, dts and duration
//...

if(ost->record){

if (first_packet) { // memorize the tps and dps of the first recorded packet
start_pts = pkt.pts;
start_dts = pkt.dts;
first_packet = false;
}

// apply offset
pkt.pts = pkt.pts - start_pts;
pkt.dts = pkt.dts - start_dts;

//remux
ret = av_interleaved_write_frame(ofmt_ctx, &pkt);
if (ret < 0) {
fprintf(stderr, "Error muxing packet\n");
break;
}
}

av_packet_unref(&pkt);
}

关于ffmpeg - 使用 libavformat 重新混合时,开始时间戳不为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59059320/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com