近几年,视频编解码技术在理论及应用方面都取得了重大的进展,越来越多的人想要了解编解码技术。因此,网易云信研发工程师为大家进行了归纳梳理,从理论及实践两个方面简单介绍视频编解码技术。

相关阅读推荐

视频直播关键技术:流畅、拥塞和延时追赶

视频直播技术详解:直播的推流调度

音视频通话:小议音频处理与压缩技术

《视频编解码的理论和实践1:基础知识介绍》

 

1Ffmpeg介绍

《视频编解码的理论和实践1:基础知识介绍》介绍了视频编码的基础知识,本篇文章,我们一起看看实际应用中的视频编码是如何操作的。

在实际工程项目中,ffmpeg是应用最多的多媒体处理框架,它提供了音视频采集、编解码、图像处理,格式转换等功能,并且拥有很强的扩展能力,通过ffmpeg可以很容易集成第三方库(例如:x264、openh264等),通过这种能力,它可以实现更强大的功能。Ffmpeg由下面几个部分构成:

Libavformat:音视频格式处理

Libavcodec:音视频编解码

Libavfilter:音视频滤镜

Libavdevice:音视频设备采集

Libswscale:图像缩放、转换

Libswresample:音频重采样

Ffmpeg:一个命令行的转码工具

Ffplay:一个命令行播放器

Ffprobe:简单的媒体格式分析工具

2Ffmpeg视频编码

视频编码是ffmpeg提供的基本功能之一,通过ffmpeg可以很容易实现视频编码操作。使用ffmpeg进行视频编码之前需要把x264、openh264等第三方编解码库集成到ffmpeg中才能使用。编码步骤如下:

(1) 注册编码器

(2) 根据名字或者ID查找你想使用的编码器(例如x264、x265、openh264等)

(3) 创建一个编码器上下文对象

(4) 在编码器上下文对象中设置编码器参数

(5) 打开编码器

(6) 读取一帧图像进行编码,一直重复该过程,直到处理结束

(7) 关闭编码器

示例代码如下:

avcodec_register_all(); // 注册所有可用的编码器

codec = avcodec_find_encoder_by_name(“libx264”); // 查找编码器

ctx = avcodec_alloc_context3(codec); // 创建编码器上下文

ctx->width = 1280; // 设置编码器参数

ctx->height = 720;

// ….其他的参数设置

avcodec_open2(ctx, codec, NULL); // 打开编码器

while(read_frame(frame)){

AVPacket pkt; // 存放编码之后的数据

int got_output = 0; // 是否成功编码得到一个图像

avcodec_encode_video2(ctx, &pkt, frame, &got_output); // 编码

if(got_output){

// 得到编码后的数据,进行后续操作

}

}

avcodec_free_context(&ctx); // 关闭编码器

可以看到,ffmpeg隐藏了大部分的编码细节,调用者不需要了解预测、变换、量化、熵编码等细节,这些细节都已经被ffmpeg封装好了,开发者只要把编码参数设置好,然后调用相关的接口函数,即可实现视频编码功能。当然,这知识最基本的编码功能,要想在画面质量和压缩率之间取得平衡,必须了解视频编码的细节,然后设置相应的参数

3Ffmpeg视频解码

Ffmpeg自带了H264的视频解码器,开发者可选择直接使用ffmpeg自带的H264解码器或者第三方的解码库进行视频解码。和视频编码一样,解码操作的大部分细节都已经被ffmpeg隐藏起来了,开发者只需要设置好相关的解码参数,然后调用接口函数就可以实现解码功了。解码流程如下:

(1) 注册解码器

(2) 查找解码器

(3) 创建解码器上下文对象

(4) 设置解码参数

(5) 打开解码器

(6) 读取数据进行解码,直到结束

(7) 关闭解码器

代码示例如下:

avcodec_register_all(); //注册解码器

codec = avcodec_find_decoder_by_name(“h264”); // 查找解码器

ctx = avcodec_alloc_context3(codec); // 创建解码器上下文对象

//…设置解码参数

avcodec_open2(ctx, codec, NULL); // 打开解码器

while(read_packet(pkt)){

AVFrame frame; // 存放解码之后的图像数据

int got_frame = 0;

avcodec_decode_video2(ctx, frame, &got_frame, pkt); // 解码

if(got_frame){

// 解码得到一帧图像,进行后续操作…

}

}

avcodec_free_context(&ctx); // 关闭解码器

可以看到ffmpeg是个非常强大的多媒体处理框架,通过ffmpeg我们可以很容易进行音视频方面的处理。上面介绍的只是ffmpeg的冰山一角,要想熟练使用ffmpeg,必须花很多时间去熟练使用它。

更多即时通讯、音视频技术的干货文章,请关注网易云信博客

视频编解码的理论和实践2:Ffmpeg视频编解码的更多相关文章

  1. 编解码再进化:Ali266 与下一代视频技术

    过去的一年见证了人类百年不遇的大事记,也见证了多种视频应用的厚积薄发.而因此所带来的视频数据量的爆发式增长更加加剧了对高效编解码这样的底层硬核技术的急迫需求. 新视频编解码标准 VVC 定稿不久之后, ...

  2. 【视频编解码·学习笔记】3. H.264视频编解码工程JM的下载与编解码

    一.下载JM工程: JM是H.264标准制定团队所认可的官方参考软件.网址如下 http://iphome.hhi.de/suehring/tml/ 从页面中可找到相应的工程源码,本次选择JM 8.6 ...

  3. 在线公开课 | 5G时代的视频云服务关键技术与实践

    5G时代来临在即,视频技术将会如何发展呢?基于视频云服务的技术开发又有怎样的变化呢?为此,京东云视频云产品研发部高级总监魏伟为大家做出了详细解读. 魏伟拥有10多年视频行业研发经验,先后从事于AVS标 ...

  4. 课程报名 | 5G时代的视频云服务关键技术与实践

    6月3日,工业和信息化部宣布将于近期发放5G商用牌照.这也意味着,中国正式进入了5G时代. 5G身上有很多新标签:"大规模天线"."新的编码技术"." ...

  5. iOS - 直播总结(理论到实践)

    一.直播原理及流程 1.一个完整直播app原理 直播原理:把主播录制的视频,推送到服务器,在由服务器分发给观众观看. 直播环节:推流端(采集.美颜处理.编码.推流).服务端处理(转码.录制.截图.鉴黄 ...

  6. SEO从理论到实践

    GITHUB:http://www.liu12fei08fei.top/blog/12seo.html 明白seo是什么 知道怎么做 SEO从理论到实践 什么是SEO? SEO和SEM的区别 SEO和 ...

  7. ffmpeg H264 编解码配置

    ffmpeg H264编解码前面有文章介绍下,本文主要介绍一些参数配置. 编码: int InitEncoderCodec( int iWidth, int iHeight) { AVCodec * ...

  8. FFmpeg(三) 编解码相关函数理解

    一.编解码基本流程 主要流程: 打开视频解码器(音频一样) 软解码.硬解码 进行编解码 下面先来看打开视频解码器 ①avcodec_register_all()//初始化解码 ②先找到解码器. 找解码 ...

  9. DevOps理论+实践之路

    DevOps理论+实践之路  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时候可以关注 ...

随机推荐

  1. linux 下Eclipse for C/C++的不常见设置

    设置1:build project的时候,让编译器支持  三字母词. 项目文件右击--> Properties-->C/C++ Build--> Settings 如图设置: 再 C ...

  2. [C#]Windows系统特殊文件夹路径获取

    原文:[C#]Windows系统特殊文件夹路径获取 由于软件开发的需要,近期对Windows特殊文件夹(如桌面,我的文档等)路径的查找方法进行了研究,结果如下. 获取特殊文件夹的方法不止一种,下面列出 ...

  3. CountDownLatch和CyclicBarrier 专题

    4.Runnable接口和Callable接口的区别 有点深的问题了,也看出一个Java程序员学习知识的广度. Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行ru ...

  4. MSRA专访摘要

    前段时间有幸参加微软亚洲研究院之旅,顺便投简历,没想到在两次访谈迎来,并且是连续 的两次被拒绝.严重的刺激到了我.导致我疯狂的复习刷Offer.如今最终算是告于段落.如今也最终有空沉下心来总结 总结近 ...

  5. js div的显示和隐藏

    <head>    <title></title>    <style type="text/css">        div    ...

  6. jquery好友面板切换

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  7. Selenium-等待

    分为3种 (1)就是通过线程强制等待 Thread.sleep(1000); (2)隐示等待.就是所有的命令都等待.分为3种 // 这个方法表示全局的等待.意思是针对所有的findElement方法都 ...

  8. 算法之--回溯法-迷宫问题【python实现】

    题目描述 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0,  ...

  9. 网络软件,BA File,Disk,Photo,BackupTools等等(Mac版)

    Auto FTP Manager 6.01Crossworld CrossFTP Enterprise v1.97.7 http://www.airexplorer.net/en/index.phpC ...

  10. jQuery.form的使用方法

    首先需要引入jquery.form.js 之后即可使用 jquery.form.js的中文API网址http://www.vaikan.com/docs/jquery.form.plugin/jque ...