美文网首页
音视频流媒体开发【四十三】FFmpeg媒体转换器7-copy

音视频流媒体开发【四十三】FFmpeg媒体转换器7-copy

作者: AlanGe | 来源:发表于2023-04-12 10:51 被阅读0次

    音视频流媒体开发-目录
    iOS知识点-目录
    Android-目录
    Flutter-目录
    数据结构与算法-目录
    uni-pp-目录

    对应代码:ffmpeg-pro-09

    ffmpe -i 9.mp4 -c copy 9.flv -y (stream copy方式)
    ffmpe -i 9.mp4 -vcodec libx264 -acodec aac 9.flv -y
    做命令⾏解析的对⽐

    命令⾏解析

    命令⾏对-c copy的解析

    const OptionDef options[] = {
    ........
        { "c", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_INPUT | OPT_OUTPUT, { .off =
            OFFSET(codec_names) },
            "codec name", "codec" },
        { "codec", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_INPUT | OPT_OUTPUT, { .off =
            OFFSET(codec_names) },
            "codec name", "codec" },
    ............
    

    对应

    typedef struct OptionsContext {
        ........
        SpecifierOpt *codec_names;
        int nb_codec_names;
        .........
    }OptionsContext;
    
    static int open_files(OptionGroupList *l,
                          const char *inout,
                          int (*open_file)(OptionsContext*, const char*))
    {
        int i, ret;
    
        for (i = 0; i < l->nb_groups; i++) {
            OptionGroup *g = &l->groups[i];
            OptionsContext o;
    
            init_options(&o); // 从OptionGroup解析出来的
            o.g = g;
    
            ret = parse_optgroup(&o, g); // 解析参数 从OptionGroup解析出来的
    
            if (ret < 0) {
                av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file " "%s.\n", inout, g->arg);
                return ret;
            }
    
            // 这⾥可以下断点查看o解析出来的codecname
            av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
            ...........
        }
    
        return 0;
    }
    

    创建输出流

    choose_encoder
    static int choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
    {
        enum AVMediaType type = ost->st->codecpar->codec_type;
        char *codec_name = NULL;
    
        if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO || type == AVMEDIA_TYPE_SUBTITLE) {
            MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
    
            if (!codec_name) {
                ost->st->codecpar->codec_id = av_guess_codec(s->oformat,NULL, s->url, NULL, ost->st->codecpar->codec_type);
                ost->enc = avcodec_find_encoder(ost->st->codecpar->codec_id);// 具体还要看存不存在
    
                .........
    
            } else if (!strcmp(codec_name, "copy"))
                ost->stream_copy = 1; // 编码器维持输⼊的即是流拷⻉
            else {
                ost->enc = find_codec_or_die(codec_name, ost->st->codecpar->codec_type, 1);
                ost->st->codecpar->codec_id = ost->enc->id;
            }
    
            ost->encoding_needed = !ost->stream_copy; // 需要编码
        } else {
            /* no encoding supported for other media types */
            ost->stream_copy = 1; // 不需要重新编码
            ost->encoding_needed = 0;
        }
        return 0;
    }
    

    读取packet和写⼊输出流

    相关文章

      网友评论

          本文标题:音视频流媒体开发【四十三】FFmpeg媒体转换器7-copy

          本文链接:https://www.haomeiwen.com/subject/jlnpddtx.html