1

我需要保存由来自两个不同来源的两个视频流生成的视频文件。我在 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 视频。

我很高兴听到任何关于这个问题的有用的想法。

4

1 回答 1

1

如果要保存原始 h.264 流,为什么不简单地存储两个单独的流,然后使用系统命令 system("cat file1 file2 > finalfile") 在命令行上单独连接文件块

如果您的输出是以下之一,您可以使用 cat 直接附加

  1. 具有相同编解码器的传输流 [ts]
  2. .mpg 文件
  3. 原始 h.264 文件
  4. 具有完全相同编码标头的原始 mpeg4 文件 [标头中提到的相同尺寸、配置文件和工具集]
  5. H.263 流

您不能直接连接 mp4 文件或 3gpp 文件。

于 2012-10-08T09:50:16.280 回答