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. Codeforces 1097 Alex and a TV Show

    传送门 除了操作 \(3\) 都可以 \(bitset\) 现在要维护 \[C_i=\sum_{gcd(j,k)=i}A_jB_k\] 类比 \(FWT\),只要求出 \(A'_i=\sum_{i|d ...

  2. js-权威指南学习笔记16

    1.元素的style属性可以用来设置样式,但是不适合用来查询样式(只能查询到内联样式). 2.CSS里的层叠指示了应用于文档中任何给定元素的样式规则是各个来源的层叠效果:Web浏览器的默认样式表.文档 ...

  3. Ubuntu搜索不到WiFi的解决办法

    时间:2018年1月25日 废话连篇:杭州下了第一场雪,冒险严寒来到实验室,打开电脑,纳尼连不上wifi了,好吧!不要被这件小事影响心情,开始修复了,经过一顿搜索,可能是因为驱动的问题,终端输入以下两 ...

  4. Path2.0中绚丽的的旋转菜单

    我们看一下实现的效果图: 在上图中,我将菜单弹出的效果设置成直线型,最终的弹出或汇总点在下面的红色按钮中. 它的实现原理是设置动画的同时并利用动画中的插入器(interpolator)来实现弹力.主要 ...

  5. 网络 IP地址、网段、子网掩码

    IP地址范围,最小:00000000,00000000,00000000,00000000:最大:11111111,11111111,11111111,11111111 即:最小:0.0.0.0 最大 ...

  6. Django 添加自定义包路径

    在设置文件里: import sys sys.path.insert(0,os.path.join(BASE_DIR,"要导包的目录名")) 用pycharm时,如果导包后没有自动 ...

  7. DevOps 发展融合运维可视化

    DevOps,是开发(Development)和运维(Operations)的组合,代表一种文化.运动或实践,旨在促进软件交付和基础设施变更软件开发人员(Dev)和 IT 运维技术人员(Ops)之间的 ...

  8. 6.JXL操作Excel

    一.简介 jxl是一个韩国人写的java操作excel的工具, 在开源世界中,有两套比较有影响的API可 供使用,一个是POI,一个是jExcelAPI.其中功能相对POI比较弱一点.但jExcelA ...

  9. 转:socket

    最近浏览了几篇有关Socket发送消息的文章,发现大家对Socket Send方法理解有所偏差,现将自己在开发过程中对Socket的领悟写出来,以供大家参考. (一)架构 基于TCP协议的Socket ...

  10. Azure Cosmos DB 使用费用参考

    之前在学习Cosmos DB 中SQL API(DocumentDB) 的时候,也就是之前做的一些笔记,看到有使用费用的一些介绍,就有兴趣的去了解了下,做了一下简单的总结. 想了解更多或是购买使用的还 ...