我刚刚开始学习VP8,所以如果这是一个愚蠢的问题,请给我一些松懈。
过去我主要使用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)));
}
上述方法非常适用于解析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中实现,欢迎使用补丁
我不看了吗?或者我只是错误地接近这个?
答案 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
的第二个参数为空)。
也许尝试指定文件路径?