C++ 如何以编程方式使用ffmpeg faststart标志?

C++ 如何以编程方式使用ffmpeg faststart标志?,c++,ffmpeg,mp4,C++,Ffmpeg,Mp4,我尝试使用H264、AAC编解码器和mp4容器转换视频以便在Android上播放。使用非系统播放器正常播放视频。但系统播放器显示错误“无法播放此视频”。 我发现问题出在moovatom中,它写在文件的末尾。 当我使用“-movflags+faststart”ffmeg标志转换视频时,它会正常播放,但当我尝试以编程方式进行转换时,它不会给出任何结果。我使用以下代码: av_dict_set( &dict, "movflags", "faststart", 0 ); ret = avform

我尝试使用H264、AAC编解码器和mp4容器转换视频以便在Android上播放。使用非系统播放器正常播放视频。但系统播放器显示错误“无法播放此视频”。 我发现问题出在moovatom中,它写在文件的末尾。 当我使用“-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设备上播放转换后的视频。

可能视频与您的Android手机不兼容?尝试使用h264基线配置文件进行转换

我假设这个答案已经很晚了,但对于仍然面临相同问题的任何人来说:这可能是由于未在音频/视频
AVCodecContext
中设置
AV\u CODEC\u标志\u GLOBAL\u标题造成的。许多指南显示,它需要在
AVFormatContext
中设置,但在使用
avcodec\u 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);

我使用基线配置文件。我通过以下代码设置它:codec->profile=FF\u profile\u H264\u constrated\u BASELINE;av记录集(&opts,“vprofile”,“基线”,0);av选项集(编解码器->私有数据,“配置文件”,“基线”,av选项搜索子项);avcodec_open2(编解码器、编码器和opts);但我还是没有结果。当我使用-vprofile baseline ffmpeg命令时,它会在Android上播放。我认为问题出在其他方面。我发现问题出在h264编码器中,因为mpeg4+aac+mp4工作正常。