0

我刚刚开始学习 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 中实现,欢迎使用补丁

我看不下去了吗?还是我只是错误地接近这个?

4

1 回答 1

1

我正在为 FFMPEG\LibAV使用这个C# 包装器(特别是这个示例文件),它与 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为空)。

也许尝试指定文件路径?

于 2014-08-22T21:15:38.783 回答