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

标签 ffmpeg video-streaming libavcodec libav

我想重新复用传入的 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);
由于头部/尾部错误,无法播放录制的流。

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

最佳答案

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

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

  • 因此,如果您没有使用您明确知道它支持原始附件b H264 的播放器,请使用其他播放器。如果您要对不确定是 MP4 还是附件 b 格式的输入进行重新混合,请尝试 -bsf h264_mp4toannexb。

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

    关于ffmpeg - 存储传入流时如何真正选择正确的格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35137957/

    相关文章:

    Python - 为什么我会收到这个 ffprobe 错误?

    python - 使用 Python 在两台计算机之间流式传输实时视频

    video-streaming - 树莓派无延迟(<10ms)视频流

    python - 将python opencv项目中的输入从图像更改为视频

    ffmpeg - 视频显示/解码/编码程序如何支持 ARM GPU?

    c++ - 与 libavcodec 链接,仍然看到 undefined reference

    bash - ffmpeg 视频到带有自定义调色板的 gif

    python - ffmpeg stdin 管道搜索

    ios - 使用 iOS 编码 mpeg-1 视频

    go - fatal error : 'libavcodec/avcodec.h' file not found caused by zergon321/reisen