分享

ffmpeg源码分析四:transcode_step函数

 开花结果 2020-03-27

该函数的主要功能是一步完整的转换工作,下面看看源代码:

static int transcode_step(void)

{

    OutputStream *ost;

    InputStream  *ist;

    int ret;

    //选择一个有效的输出流进行处理

    ost = choose_output(); 

    if (!ost) {

        if (got_eagain()) {

            reset_eagain();

            av_usleep(10000);

            return 0;

        }

        av_log(NULL, AV_LOG_VERBOSE, "No more inputs to read from, finishing.\n");

        return AVERROR_EOF;

    }

    //选择一个输入流

    if (ost->filter) {

        if ((ret = transcode_from_filter(ost->filter->graph, &ist)) < 0)

            return ret;

        if (!ist)

            return 0;

    } else {

        av_assert0(ost->source_index >= 0);

        ist = input_streams[ost->source_index];

    }

    //读取并处理每一个包

    ret = process_input(ist->file_index);

    if (ret == AVERROR(EAGAIN)) {

        if (input_files[ist->file_index]->eagain)

            ost->unavailable = 1;

        return 0;

    }

    if (ret < 0)

        return ret == AVERROR_EOF ? 0 : ret;

    return reap_filters(); //根据滤波器做滤波处理,并把处理完的音视频输出到输出文件中

}

解码流程是:process_input() -> output_packet() -> decode_audio()/decode_video()/transcode_subtitles()

而decode_audio() 是调用 avcodec_decode_audio4() 来完成工作的。decode_video() 则是通过调用 avcodec_decode_video2() 来完成的。

编码流程是:reap_filters() -> do_video_out() 或 do_audio_out() -> avcodec_encode_video2() 或 avcodec_encode_audio2()。

原文链接:https://blog.csdn.net/u012905728/java/article/details/25099979

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多