使用FFmpeg对视频进行编解码的一般流程

1. 编码:

1.对编码资源的初始化

   AVCodec*                m_pVideoEncoder;// 特定编码器的参数信息
    AVCodecContext*         m_pVideoEncoderContext;// 设置的编码参数信息
    AVFrame*                m_YUV_Frame;// RGB转换为YUV数据帧以减少传输数据量,减少网络带宽占用
    AVFrame*                m_RGB_Frame;// 获取到的数据帧
    SwsContext*             m_pSwsc;// 保存由YUV转换为RGB的转换参数的结构体
    // 根据给定的编码器ID找到注册过的编码器
    m_pVideoEncoder = avcodec_find_encoder(AV_CODEC_ID_H264);
    if (!m_pVideoEncoder)
    {
        assert(0);
        return false;
    }
    // 申请一个AVCodecContext结构体,注意使用avcodec_free_context()函数释放
    m_pVideoEncoderContext = avcodec_alloc_context3(m_pVideoEncoder);
    if(!m_pVideoEncoderContext)
    {
        assert(0);
        return false;
    }

    // 对m_pVideoEncoderContext设置一些参数
    m_pVideoEncoderContext->width = frameWidth;
    m_pVideoEncoderContext->height = frameHeight;
  // ......  // 初始化AVCodecContext
    int err = avcodec_open2(m_pVideoEncoderContext, m_pVideoEncoder,NULL);
    if ( err < 0)
    {
        assert(0);
        char errorStr[256];
        av_strerror(err,errorStr,256);

        return false;
    }
    // 申请AVFrame
    m_YUV_Frame = av_frame_alloc();
  // 获取保留图像拉伸参数的结构体
    m_pSwsc = sws_getContext(frameWidth,frameHeight,g_Format,frameWidth,frameHeight,AV_PIX_FMT_YUV420P,SWS_ALGORITHM,NULL,NULL,NULL);
    if (!m_pSwsc)
    {
        assert(0);
        return false;
    }
    m_RGB_Frame = av_frame_alloc();

2.编码

        // 将原始数据(RGB格式的)填充到一个RGB的AVFrame中
        avpicture_fill((AVPicture*)m_RGB_Frame, (uint8_t*)rawVideo, g_Format, m_nLastFrameWidth, m_nLastFrameHeight);
        // 将RGB格式的AVFrame转换为YUV格式,以降低传输数据的总量
        sws_scale(m_pSwsc,m_RGB_Frame->data,m_RGB_Frame->linesize,0,m_pVideoEncoderContext->height,m_YUV_Frame->data,m_YUV_Frame->linesize);

        AVPacket packet;
        av_init_packet(&packet);
     int bOutPacketNonEmpty = 0;
        int nRet = avcodec_encode_video2(m_pVideoEncoderContext, &packet, m_YUV_Frame, &bOutPacketNonEmpty);      if(nRet < 0)     { return false; }     // 将AVPacket传输     // ......

2. 解码:

1.对解码资源的初始化

    AVCodec*            m_pVideoDecoder;
    AVCodecContext*     m_pVideoDecoderContext;

    AVPacket            m_recvPacket;
    AVFrame*            m_pYUVFrame;

    SwsContext*         m_pSwsc;// 保存由YUV转换为RGB的转换参数的结构体
    AVFrame*            m_pRGBFrame;// 用于显示
    // 根据数据包的编码格式,找到对应的解码器   m_pVideoDecoder = avcodec_find_decoder((AVCodecID)codecid);
    if (!m_pVideoDecoder)
    {
        fprintf(stderr, "Codec not found\n");
        return false;
    }

    m_pVideoDecoderContext = avcodec_alloc_context3(m_pVideoDecoder);
    int ret = avcodec_open2( m_pVideoDecoderContext, m_pVideoDecoder, NULL);
    if(ret < 0)
    {
        return false;
    }

2.解码

    av_init_packet(&m_recvPacket);
    m_recvPacket.size = videoPacket.length;
    m_recvPacket.data = videoPacket.pData;

    int got_frame = 0;
    while (m_recvPacket.size)
    {
        int len = avcodec_decode_video2(m_pVideoDecoderContext, m_pYUVFrame, &got_frame, &m_recvPacket);
        if (len < 0)
        {
return false;
        }
        if (m_recvPacket.data)
        {
            m_recvPacket.size -= len;
            m_recvPacket.data += len;
        }
    }

    if(got_frame == 0)
    {
        return false;
    }  // 将m_pYUVFrame转换为RGBFrame用于显示  // ......
时间: 2024-12-14 22:22:44

使用FFmpeg对视频进行编解码的一般流程的相关文章

iOS8系统H264视频硬件编解码说明

文章-原址 公司项目原因,接触了一下视频流H264的编解码知识,之前项目使用的是FFMpeg多媒体库,利用CPU做视频的编码和解码,俗称为软编软解.该方法比较通用,但是占用CPU资源,编解码效率不高.一般系统都会提供GPU或者专用处理器来对视频流进行编解码,也就是硬件编码和解码,简称为硬编解码.苹果在iOS 8.0系统之前,没有开放系统的硬件编码解码功能,不过Mac OS系统一直有,被称为Video ToolBox的框架来处理硬件的编码和解码,终于在iOS 8.0后,苹果将该框架引入iOS系统.

ffmpeg强化一:编解码过程,基本用法

1  术语: 什么是影片?其实就是一组(很多张)图片,时间间隔很小的连续展示出来,人们就觉得画面中的人物在动,这就是影片.那电影的实质就是N多张图片的集合.那 每张图片和帧又有什么关系呢?事实上,如果一部影片里面的图片,我们原封不动的全部存起来,空间会很大很大很大,但是如果通过一定的算法(这里不讲相关算 法),把每一张图片压缩(编码_encode)一下,变成 帧.再把帧连起来变成流,再把不同的流放到某个容器里面,这就是我们平常看见的电影文件了,文件 碟中谍4.H264.ACC.mkv,他为什么要

FFMPEG视音频编解码零基础学习方法-b

感谢大神分享,虽然现在还看不懂,留着大家一起看啦 PS:有不少人不清楚“FFmpeg”应该怎么读.它读作“ef ef em peg” 0. 背景知识 本章主要介绍一下FFMPEG都用在了哪里(在这里仅列几个我所知的,其实远比这个多).说白了就是为了说明:FFMPEG是非常重要的. 使用FFMPEG作为内核视频播放器: Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音... 使用FFMPEG作为内核的Directshow Filter: ffdshow,lav fil

FFMPEG视音频编解码零基础学习方法

在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在“大神”和初学者之间好像有一个不可逾越的鸿沟.“大神”们水平高超,探讨着深奥的问题:而初学者们还停留在入门阶段.究竟是什么原因造成的这种“两极分化”呢?最后,我发现了问题的关键:FFMPEG难度比较大,却没有一个循序渐进,由简单到复杂的教程.现在网上的有关FFMPEG的教程多半难度比较大,不太适合刚接

[总结]FFMPEG视音频编解码零基础学习方法

转至 http://my.oschina.net/leixiaohua1020/blog/302174 在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在“大神”和初学者之间好像有一个不可逾越的鸿沟.“大神”们水平高超,探讨着深奥的问题:而初学者们还停留在入门阶段.究竟是什么原因造成的这种“两极分化”呢?最后,我发现了问题的关键:FFMPEG难度比较

转[总结]FFMPEG视音频编解码零基础学习方法 .

http://blog.csdn.net/leixiaohua1020/article/details/15811977 在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在“大神”和初学者之间好像有一个不可逾越的鸿沟.“大神”们水平高超,探讨着深奥的问题:而初学者们还停留在入门阶段.究竟是什么原因造成的这种“两极分化”呢?最后,我发现了问题的关键:F

FFMPEG视音频编解码零基础学习方法 【荐】

在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频 编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在“大神”和初学者之间好像有一 个不可逾越的鸿沟.“大神”们水平高超,探讨着深奥的问题:而初学者们还停留在入门阶段.究竟是什么原因造成的这种“两极分化”呢?最后,我发现了问题的 关键:FFMPEG难度比较大,却没有一个循序渐进,由简单到复杂的教程.现在网上的有关FFMPEG的教程多半难度比较大,不太适

[总结]FFMPEG视音频编解码零基础学习方法【转】

本文转载自:http://blog.csdn.net/leixiaohua1020/article/details/15811977 在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在“大神”和初学者之间好像有一个不可逾越的鸿沟.“大神”们水平高超,探讨着深奥的问题:而初学者们还停留在入门阶段.究竟是什么原因造成的这种“两极分化”呢?最后,我发现了问

[总结]FFMPEG视音频编解码零基础学习方法--转

ffmpeg编解码学习 目录(?)[-] ffmpeg程序的使用ffmpegexeffplayexeffprobeexe 1 ffmpegexe 2 ffplayexe 3 ffprobeexe ffmpeg库的使用视频播放器 1 ffmpeg库的配置 2 最简单的视频播放器 3 相关结构体的研究 ffmpeg库的使用音频播放器 1 最简单的音频播放器 ffmpeg库的使用一个真正的播放器ffplay 1 真正的播放器 ffmpeg库的使用编码 1 编码 2 转码 ffmpeg源代码分析 FFm