FFmpeg 输出 mp4 时 moov 前置

来源:互联网 发布:游戏修改大师软件源 编辑:程序博客网 时间:2024/05/22 08:21
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;}
原创粉丝点击