FFmpeg 輸出 mp4 時 moov 前置

av_dict_set(&dict, "movflags", "faststart", 0);

示例(obs -> ffmpeg-mux.c)

static inline int open_output_file(struct ffmpeg_mux *ffm)
{
    AVOutputFormat *format = ffm->output->oformat;
    int ret;

    if ((format->flags & AVFMT_NOFILE) == 0) {
        ret = avio_open(&ffm->output->pb, ffm->params.file,
                AVIO_FLAG_WRITE);
        if (ret < 0) {
            printf("Couldn't open '%s', %s",
                    ffm->params.file, av_err2str(ret));
            return FFM_ERROR;
        }
    }

    strncpy(ffm->output->filename, ffm->params.file,
            sizeof(ffm->output->filename));
    ffm->output->filename[sizeof(ffm->output->filename) - 1] = 0;

    AVDictionary *dict = NULL;
    if ((ret = av_dict_parse_string(&dict, ffm->params.muxer_settings,
                "=", " ", 0))) {
        printf("Failed to parse muxer settings: %s\n%s",
                av_err2str(ret), ffm->params.muxer_settings);

        av_dict_free(&dict);
    }

    // 設置 moov 前置選項 (源碼中無此設置)
    av_dict_set(&dict, "movflags", "faststart", 0);

    if (av_dict_count(dict) > 0) {
        printf("Using muxer settings:");

        AVDictionaryEntry *entry = NULL;
        while ((entry = av_dict_get(dict, "", entry,
            AV_DICT_IGNORE_SUFFIX)))
            printf("\n\t%s=%s", entry->key, entry->value);

        printf("\n");
    }

    ret = avformat_write_header(ffm->output, &dict);
    if (ret < 0) {
        printf("Error opening '%s': %s",
                ffm->params.file, av_err2str(ret));

        av_dict_free(&dict);

        return ret == -22 ? FFM_UNSUPPORTED : FFM_ERROR;
    }

    av_dict_free(&dict);

    return FFM_SUCCESS;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章