【问题标题】:How to use ffmpeg faststart flag programmatically?如何以编程方式使用 ffmpeg 快速启动标志?
【发布时间】:2014-10-30 13:13:24
【问题描述】:

我尝试使用 H264、AAC 编解码器和 mp4 容器转换视频以在 Android 上播放。视频在非系统播放器上正常播放。但系统播放器显示错误“无法播放此视频”。 我发现问题出在 moov atom 中,它写在文件末尾。 当我使用“-movflags +faststart”ffmeg 标志转换视频时,它可以正常播放,但是当我尝试以编程方式执行此操作时,它没有结果。我使用以下代码:

av_dict_set( &dict, "movflags", "faststart", 0 );
ret = avformat_write_header( ofmt_ctx, &dict );

【问题讨论】:

    标签: c++ ffmpeg mp4


    【解决方案1】:

    这段代码运行良好:

    av_dict_set( &dict, "movflags", "faststart", 0 );
    ret = avformat_write_header( ofmt_ctx, &dict );
    

    但是问题没有解决。我仍然无法在 Android 设备上播放转换后的视频。

    【讨论】:

      【解决方案2】:

      也许视频与您的安卓手机不兼容?尝试使用 h264 基线配置文件进行转换。

      【讨论】:

      • 我使用基线配置文件。我通过以下代码设置它:codec->profile = FF_PROFILE_H264_CONSTRAINED_BASELINE; av_dict_set( &opts, "vprofile", "基线", 0 ); av_opt_set(codec->priv_data, "profile", "baseline", AV_OPT_SEARCH_CHILDREN); avcodec_open2(编解码器,编码器,&opts);但我还是没有结果。当我使用 -vprofile baseline ffmpeg 命令时,它会在 Android 上播放。我认为问题出在别的地方。
      • 我发现问题出在 h264 编码器中,因为 mpeg4+aac+mp4 工作正常。
      【解决方案3】:

      我认为这个答案已经很晚了,但是对于可能仍然面临同样问题的任何人来说:这可能是由于音频/视频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);
      

      【讨论】:

        【解决方案4】:

        TL;DR

        avformat_write_header之前设置AVFormatContexturl字段。

        为什么

        我今天遇到同样的问题,我发现调用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;
        }
        

        【讨论】:

          猜你喜欢
          • 2023-04-07
          • 2016-07-27
          • 1970-01-01
          • 1970-01-01
          • 2011-03-30
          • 1970-01-01
          • 2014-02-27
          • 1970-01-01
          • 2015-02-13
          相关资源
          最近更新 更多