如何以编程方式使用ffmpeg快速启动标志
How to use ffmpeg faststart flag programmatically?
我尝试使用H264、AAC编解码器和mp4容器转换视频以在Android上播放。视频在非系统播放器中正常播放。但系统播放器显示错误"无法播放此视频"。我发现问题出在moov原子中,它写在文件的末尾。当我使用"-movflags+faststart"ffmeg标志转换视频时,它会正常播放,但当我尝试以编程方式进行转换时,它不会给出任何结果。我使用以下代码:
av_dict_set( &dict, "movflags", "faststart", 0 );
ret = avformat_write_header( ofmt_ctx, &dict );
此代码运行良好:
av_dict_set( &dict, "movflags", "faststart", 0 );
ret = avformat_write_header( ofmt_ctx, &dict );
但问题并没有得到解决。我仍然无法在Android设备上播放转换后的视频。
我认为这个答案已经很晚了,但对于任何可能仍然面临相同问题的人来说:这可能是由于音频/视频AVCodecContext
中没有设置AV_CODEC_FLAG_GLOBAL_HEADER
造成的。许多指南显示,它需要在AVFormatContext
中设置,但在使用avcodec_open2
打开它之前,它需要先在AVCodecContext
中设置。
if (format_context->oformat->flags & AVFMT_GLOBALHEADER) {
video_codec_context->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
}
avcodec_open2(video_codec_context, video_codec, nullptr);
TL;DR
在avformat_write_header
之前设置AVFormatContext
的url
字段。
为什么
我今天遇到了同样的问题,在调用av_write_trailer
:时发现有一个日志
无法重新打开第二次通过(快速启动)的输出文件
在movenc.c
的实现中,我们可以看到它需要s->url
来重新打开文件:
avio_flush(s->pb);
ret = s->io_open(s, &read_pb, s->url, AVIO_FLAG_READ, NULL);
if (ret < 0) {
av_log(s, AV_LOG_ERROR, "Unable to re-open %s output file for "
"the second pass (faststart)n", s->url);
goto end;
}
也许视频与您的android手机不兼容?尝试使用h264基线配置文件进行转换。
相关文章:
- 如何创建一个空的全局类并在启动时实例化它
- 即使我读取了所有内容,在FIFO上打开的QSocketNotifier也会一直启动
- 使用 std::string () const 函数启动线程或未来
- 即使使用调试编译标志,表达式也是"optimized out"
- 在 CMake 中为每个目标设置编译器/链接器标志
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- 如何创建线程序列以按照启动顺序执行任务?
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- 在挂钩启动新线程时解除挂钩进程
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- 程序无法启动,因为缺少 libmpc-3.dll
- 在轮班操作后使用携带标志
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- 如何找出引入AVX标志的内容
- QSerialPort 在应用程序启动之前正在使用中
- 无法在 Arch Linux 中启动虚幻引擎 4
- C++关于指针和使用函数将它们启动到堆的行为究竟是什么?
- 使用优化标志进行编译时线程不启动
- 如何以编程方式使用ffmpeg快速启动标志