我需要保存由来自两个不同来源的两个视频流生成的视频文件。我在 tcp/ip 上使用 rtsp,视频是用 h264 编码的。我需要先从第一个来源录制视频,然后再继续使用第二个来源。所以我尝试的是声明两个 AVFormatContext 实例,初始化两者,avformat_open_input(&context, "rtsp://......",NULL,&options)
然后读取帧av_read_frame(context,&packet)
并将它们写入视频文件av_write_frame(oc,&packet);
它可以很好地保存来自第一个源的视频,但是如果例如我从第一个上下文中保存了y帧,当我尝试从第二个上下文中读取并保存帧在同一文件中时,对于我要保存的前y帧,av_write_frame(oc,&packet2);
将重新调整 -22,并且不会将帧添加到文件中。
我认为问题在于上下文变量记住了读取了多少帧,并且它为每个读取的数据包提供了一个标识号,以确保它不会被写入两次。但是当我使用新的上下文时,这些标识号会重置,AVOutputFormat 或 AVFormatContext 也会保留他们期望接收的包的 ID,并且在他们收到具有该 ID 的包之前不会写入任何内容。现在我想知道如何解决这种不便。我找不到该 id 的任何设置器,或任何重用相同上下文的方法。我想修改 ffmpeg 源,但它们非常复杂,我找不到我要找的东西。另一种方法是将两个视频保存在两个不同的文件中,但是,我不知道之后如何附加它们,因为 ffmpeg 只能附加用 mpeg 编码的视频,而重新编码视频并不是一个真正的选择,因为这需要很多时间。此外,我找不到任何其他功能方式来附加两个用 h264 编码的 mp4 视频。
我很高兴听到任何关于这个问题的有用的想法。