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

相关阅读推荐

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

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

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

《视频编解码的理论和实践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. LockWindowUpdate的函数的用法

    Application.ProcessMessages;LockWindowUpdate(Self.Handle); //锁住当前窗口 LockWindowUpdate(0)//解除锁定窗口 Lock ...

  2. Android--数据持久化存储概述

    Android数据持久化存储共有四种方式,分别是文件存储.SharedPreferences.Sqlite数据库和ContentProvider.在本篇幅中只介绍前面三种存储方式,因为ContentP ...

  3. 知乎C++问题整理

    如何平衡性能,合理选择C++STL集装箱? ANSER: 首先要搞清楚,假设STL问题,那么问题出在哪里? STL能够简单地觉得就是算法+数据结构,全部容器的算法选择和实现都是经过精心设计和严格測试的 ...

  4. the solution about "messy code" in elicpse

    I use the Elicpse IDE to develope the ansdroid app.Sometime encounter the messy code in the Elicpse ...

  5. 2019 renew 博客目录

    .net && .net core Microsoft.AspNet.SignalR实现弹幕(即时通讯) C#调用JS httpclient POST请求(urlencoded) 二维 ...

  6. Angular 请求另一服务的api(请求代理)

    1.edit "start" of your package.json to look below 定义一个叫做start的新命令 "start": " ...

  7. docker include not found: networks

    启动clickhouse的docker镜像时,出现了以下错误 include not found: networks google之后发现是因为可能不支持ipv6导致的解决方法 就是通过设置 /etc ...

  8. AngularJS 页面计算

    <div ng-app="multipliedCaculateApp" ng-controller="multipliedCaculateController as ...

  9. WPF 通过CommandBinding捕获命令

    RoutedCommand与业务逻辑无关,业务逻辑是通过CommandBinding来实现 using System; using System.Collections.Generic;using S ...

  10. 【C#】wpf查找父子节点

    原文:[C#]wpf查找父子节点 using System; using System.Collections.Generic; using System.Linq; using System.Tex ...