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();
return false;
}
// 申请一个AVCodecContext结构体,注意使用avcodec_free_context()函数释放
m_pVideoEncoderContext = avcodec_alloc_context3(m_pVideoEncoder);
if(!m_pVideoEncoderContext)
{
assert();
return false;
} // 对m_pVideoEncoderContext设置一些参数
m_pVideoEncoderContext->width = frameWidth;
m_pVideoEncoderContext->height = frameHeight;
  // ......
  // 初始化AVCodecContext
int err = avcodec_open2(m_pVideoEncoderContext, m_pVideoEncoder,NULL);
if ( err < )
{
assert();
char errorStr[];
av_strerror(err,errorStr,); 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();
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,,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 < )
     { 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 < )
{
return false;
}

2.解码

    av_init_packet(&m_recvPacket);
m_recvPacket.size = videoPacket.length;
m_recvPacket.data = videoPacket.pData; int got_frame = ;
while (m_recvPacket.size)
{
int len = avcodec_decode_video2(m_pVideoDecoderContext, m_pYUVFrame, &got_frame, &m_recvPacket);
if (len < )
{
return false;
}
if (m_recvPacket.data)
{
m_recvPacket.size -= len;
m_recvPacket.data += len;
}
} if(got_frame == )
{
return false;
}
  // 将m_pYUVFrame转换为RGBFrame用于显示
  // ......

FFMpeg笔记(二) 使用FFmpeg对视频进行编解码的一般流程的更多相关文章

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

    公司项目原因,接触了一下视频流H264的编解码知识,之前项目使用的是FFMpeg多媒体库,利用CPU做视频的编码和解码,俗称为软编软解.该方法比较通用,但是占用CPU资源,编解码效率不高.一般系统都会 ...

  2. 转:关于视频H264编解码的应用实现

    转:http://blog.csdn.net/scalerzhangjie/article/details/8273410 项目要用到视频编解码,最近半个月都在搞,说实话真是走了很多弯路,浪费了很多时 ...

  3. ffmpeg编解码视频导致噪声增大的一种解决方法

    一.前言 ffmpeg在视音频编解码领域算是一个比较成熟的解决方案了.公司的一款视频编辑软件正是基于ffmpeg做了二次封装,并在此基础上进行音视频的编解码处理.然而,在观察编码后的视频质量时,发现图 ...

  4. 【视频编解码·学习笔记】8. 熵编码算法:基本算法列举 & 指数哥伦布编码

    一.H.264中的熵编码基本方法: 熵编码具有消除数据之间统计冗余的功能,在编码端作为最后一道工序,将语法元素写入输出码流 熵解码作为解码过程的第一步,将码流解析出语法元素供后续步骤重建图像使用 在H ...

  5. 音视频编解码技术(一):MPEG-4/H.264 AVC 编解码标准

    一.H264 概述 H.264,通常也被称之为H.264/AVC(或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC) 1. H.264视频编解码的意义 H.264的出现就是为了创 ...

  6. Android 音视频深入 二十一 FFmpeg视频剪切

    视频剪切我意外的发现上一次的视频压缩的代码能够运行FFmpeg视频剪切的命令,但是不能做视频合并的命令,因为不能读取记录了几个视频的路径的txt文件. 这里我就说直说视频剪切的过程,不说代码,只说lo ...

  7. Android 音视频深入 二十 FFmpeg视频压缩(附源码下载)

    项目源码https://github.com/979451341/FFmpegCompress 这个视频压缩是通过类似在mac终端上输入FFmpeg命令来完成,意思是我们需要在Android上达到能够 ...

  8. 视频专家之路【二】:ffmpeg工具的使用

    本文是听了雷宵骅大神的课之后的总结,部分内容借用了其PPT的内容,如有侵权请告知删除. 雷宵骅大神的博客为:https://blog.csdn.net/leixiaohua1020 要学习汽修,那么首 ...

  9. 【FFMPEG】各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式

    目录(?)[-] 编解码学习笔记二codec类型 编解码学习笔记三Mpeg系列Mpeg 1和Mpeg 2 编解码学习笔记四Mpeg系列Mpeg 4 编解码学习笔记五Mpeg系列AAC音频 编解码学习笔 ...

随机推荐

  1. iTem2 保持连接,解决ssh的"Write failed: Broken pipe"问题

    方法一: profiles -> sessions -> When idel, send ASCII code 问题场景 服务器环境:阿里云 Linux CentOS 主机 客户端:Mac ...

  2. 浏览器根对象navigator之客户端检测

    Navigator的5个主要属性: appName:Web浏览器的名称 appVersion:浏览器的版本号和其他版本信息 userAgent:浏览器在它的USER-AGENT HTTP标题中发送的字 ...

  3. 在已配置成功的opencv3.2.0下配置opencv_contrib模块

    简介: 之前在Ubuntu下配置OpenCV时,因为对opencv3..0不是特别了解,没有把opencv_contrib进行安装,这里提醒大家尽量要一次性安装完毕,减少不必要的麻烦. .0文件夹 ( ...

  4. atitit。流程图的设计与制作 attilax 总结

    atitit.流程图的设计与制作 attilax 总结 1. 流程图的规范1 2. 绘图语言2 2.1. atitit.CSDN-markdown编辑器2 2.2. js-sequence-diagr ...

  5. JSON学习笔记-2

    JSON的语法 1.JSON 数据的书写格式是:名称/值对. "name" : "我是一个菜鸟" 等价于这条 JavaScript 语句: name = &qu ...

  6. ubuntu16.04安装五笔输入法

    在 Ubuntu16.04 中为fctix小企鹅增加五笔输入法 转载:https://jingyan.baidu.com/article/454316ab67d702f7a7c03a1a.html U ...

  7. springMVC入门-07

    删除功能实现,对应controller类中的代码如下所示: @RequestMapping(value="/{username}/delete",method=RequestMet ...

  8. Ubuntu安装 和 python开发

    在ubuntu上安装pycharm 可以好几种下载办法 1.pycharm之linux版本下载地址: https://download.jetbrains.8686c.com/python/pycha ...

  9. (转)光照模型及cg实现

    经典光照模型(illumination model) 物体表面光照颜色由入射光.物体材质,以及材质和光的交互规律共同决定. 由于环境光给予物体各个点的光照强度相同,且没有方向之分,所以在只有环境光的情 ...

  10. LinkedHashSet 元素唯一,存储取出有序

      package cn.itcast_04; import java.util.LinkedHashSet; /* * LinkedHashSet:底层数据结构由哈希表和链表组成. * 哈希表保证元 ...