存储传入流时如何真正选择正确的格式?

How can I really pick up the correct format when storing incoming stream?

我想重新混合传入的 h264 流。但是我怎样才能为 AVFormatContext 选择正确的 AVOutputFormat?

目前我用过:

AVOutputFormat* fmt = av_guess_format(NULL, "xxx.avi", NULL);

// Open the context
//---------------------------------------------------------------------
outFormatCtx = ffmpeg::avformat_alloc_context();

//Set the output format
//----------------------------------------------------------------------
outFormatCtx->oformat = fmt;

一切正常。 但是,如果我将第一行更改为: av_guess_format("h264",NULL, NULL); 由于 header/tailer.

错误,无法播放录制的流

有没有更聪明的方法来选择要使用的正确 AVOutputFormat?

你用什么来播放它,你正在重新混合什么输入流?这很重要,因为您正在尝试编写原始 annexb H264 流。

  • 并非所有玩家都支持这一点。例如。 VLC 支持它,但 Windows Media Player 不支持。
  • 它要求H264数据包实际上是annexb格式。如果你正在重新混合,例如一个 mp4 文件,H264 数据包将是 mp4 格式,你需要一个比特流过滤器来转换它们 (-bsf h264_mp4toannexb).

因此,如果您使用的播放器不是您明确知道它支持原始 annexb H264,请使用其他播放器。如果您正在重新混合您不确定它是 MP4 还是 annexb 格式的输入,请尝试 -bsf h264_mp4toannexb.

也有可能您实际上并不想编写原始的 annexb H264 流。如果以上所有内容对您来说都是神秘的,并且您认为我在胡说八道,那么情况可能就是这样。在这种情况下,不要在调用 av_guess_format() 时使用 "h264" 作为格式(第一个参数)(因为它主要是视频编解码器,而不是容器格式),而是使用 "mp4" 或"avi" 或 "matroska"(容器格式)。