如何用libav解析VP8比特流

时间:2014-07-25 02:46:12

标签: libav vp8 libvpx

我刚刚开始学习VP8,所以如果这是一个愚蠢的问题,请给我一些松懈。

H.264示例

过去我主要使用H.264。每当我需要解析H.264比特流时,我会利用libav帮助我并使用类似这样的东西

av_register_all();

_ioContext = avio_alloc_context(
        encodedData,
        H264_READER_BUF_SIZE,
        0,
        0,
        &readFunction,
        NULL,
        NULL);
if (_ioContext == NULL)
    throw std::exception("Unable to create AV IO Context");

AVInputFormat *h264Format = av_find_input_format("h264");
if (h264Format == NULL) {
    throw std::exception("Unable to find H264 Format");
}

_context = avformat_alloc_context();
_context->pb = _ioContext;

ret = avformat_open_input(&_context,
        "",
        h264Format,
        NULL);

if (ret != 0) {
    throw std::exception(
            "Failed to open input file :" +
            std::string(_avErrToString(ret)));
}

VP8

上述方法非常适用于解析H.264比特流,并为我提供H.264帧以供我自己的解码基础设施使用。

我正在尝试与VP8重复同样的工作。我尝试使用此代码作为基础,而不是寻找“h264”格式,我尝试过“vp8”和“webm”。 “vp8”似乎无效,但“webm”能够加载格式。但是,当我到达avformat_open_input时,我收到此错误:

  

[matroska,webm @ 0x101812400]未知条目0xF0
  [matroska,webm @ 0x101812400]使用不支持的功能的EBML标题
  (EBML版本0,doctype(null),doc版本0)
  无法打开输入文件:尚未在FFmpeg中实现,欢迎使用补丁

我不看了吗?或者我只是错误地接近这个?

1 个答案:

答案 0 :(得分:1)

我正在使用this C#wrapper for FFMPEG \ LibAV(特别是this示例文件),它具有与C ++相同的语法,并且工作正常。

错误消息显示它尚未实现,因此我建议更新您的libav库。

正在运行的一段代码(包括我修改的AVInputFormat,链接的示例文件中没有):

FFmpegInvoke.av_register_all();
FFmpegInvoke.avcodec_register_all();
FFmpegInvoke.avformat_network_init();

string url = @"C:\file.webm";

AVFormatContext* pFormatContext = FFmpegInvoke.avformat_alloc_context();

AVInputFormat* pFormatExt = FFmpegInvoke.av_find_input_format("webm");

if (FFmpegInvoke.avformat_open_input(&pFormatContext, url, pFormatExt, null) != 0)
    throw new Exception("Could not open file"); //no exception is thrown

//more code to decode frames, and frames are decoded successfully

如果这不起作用,那么可能是您正在打开文件(avformat_open_input的第二个参数为空)。

也许尝试指定文件路径?