问题描述
关于如何将我的编码器结果复用到 mp4 文件中,我遇到了一些基本问题。我目前的方法是创建一个自定义 AVFormatContext
,其中 DataProvider
是编码器:
AVFormatContext *create_format_context(DataProvider *pDataProvider) {
AVFormatContext *ctx{avformat_alloc_context()};
size_t bufSize{8 * 1024 * 1024};
uint8_t *avBuffer{(uint8_t*)av_malloc(bufSize)};
ctx->pb = avio_alloc_context(avBuffer,bufSize,pDataProvider,DataProvider::read,nullptr,nullptr);
ctx->flags |= AVFMT_FLAG_CUSTOM_IO;
FFMPEG_CALL(avformat_open_input(&ctx,nullptr));
return ctx;
}
但我在 avformat_open_input
上崩溃并显示以下错误消息:
处理输入时发现无效数据
它第一次尝试从编码器读取,但由于这是在初始化时,编码器还没有任何结果。我想问题是 ffmpeg 试图查询一些头信息,因为刚打开时询问实际数据会感觉很奇怪。
我如何提供该标头信息/我可以在哪里了解有关此标头的外观以及我还需要为 ffmpeg 提供哪些信息?
或者是否有完全不同的方法,因为老实说,如果我可以将每帧编码的数据直接提供给 ffmpeg 而不是通过整个上下文抽象,我会很高兴。
对于上下文,我粘贴了 muxer 类,我猜progress() 函数是最有趣的,这里是 header,source。
我也称之为有点神奇的功能
av_register_all();
avcodec_register_all();
avformat_network_init();
在所有关于 ffmpeg 的事情之前。
编码器不是用 ffmpeg 编写的,而是用 cuda/nvidia 视频 sdk 编写的,用于硬件加速。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)