cvmachine.com - 申博开户网

查找: 您的方位主页 > 网络频道 > 阅览资讯:FFmpeg开发教程 --- 音视频播映和编码流程

FFmpeg开发教程 --- 音视频播映和编码流程

2019-04-05 05:22:31 来历:www.cvmachine.com 【

本系列文章居于FFMpeg源码4.1版别,因而,有些流程和老版别会有略微不同(源码我做了具体注释,有需求请在下方谈论留言,写明邮箱,我会一致发给你们

FFMpeg的运用网上介绍的很多了,这儿首要选用结构化思想的方法来对FFMpeg的运用进行介绍,让咱们有一个全体到部分概念,能够比较清楚知道运用FFMpeg的流程以及运用中需求留意的东西。
这一节先从全体介绍咱们运用FFMpeg首要完结的功用,以及在这一个进程中有那些很要害的点需求留意和独自进行阐明的。
咱们知道FFMpeg首要便是处理音视频的,那么音视频不外乎便是播映和编码,那么咱们就从这两个方面进行阐明,然后顺次分分出播映和编码中首要的要害步骤。

1. 视频播映

下图描绘FFMpeg播映视频文件的规范流程:

FFmpeg开发教程 --- 音视频播映和编码流程

上图中红框里的流程关于视频和音频调用是相同的,不同是传入的解码器不相同,从这儿看出,FFMpeg对音视频的封装仍是很到位的,对音视频的处理比较一致,这也不难看出FFMpeg其实便是一个上层的音视频处理结构,具体的交由对应封装格局处理模块以及音视频编解码模块处理。
从上图看到有两个要害功用点:解码后过滤器对数据的过滤处理;音视频播映时同步战略。

1.1 FFMpeg过滤器

在FFMpeg中正确对音视频解码后,获取的数据存放在AVFrame中,视频对应的裸数据格局为YUV,音频对应的裸数据格局为PCM。
关于视频和音频数据在送入播映设备播映之前,或许需求对裸数据进行效果叠加处理,比方视频需求叠加水印,音频需求变声处理,关于这些需求,FFMpeg供给完好的插件化支撑,这便是FFMpeg中的过滤器功用,具体咱们会运用几节来具体说下FFMpeg中的过滤器。

1.2 FFMpeg音视频播映同步

音视频同步是视频播映中很中心的功用,其同步的原理便是选定一个时钟基准,然后其它的流的时钟同步到这个选定的时钟基准,播映慢的加速,播映快的减慢,这样音视频的播映就会一向,不会形成声响说了视频还没播映的现象。
现在音视频同步首要有三种:同步到音频、同步到视频、同步到外部时钟。
在FFMpeg供给的默许播映器里三种都完成了,可是默许运用的是同步到音频,由于人对声响的敏感度比对图画的敏感度要求要高,因而,绝大多数视频播映器都挑选同步到音频,由于声响是接连的,对其要求很高。
同步的细节会独自阐明,这儿简略提几个同步相关的概念:I症B症P帧以及PTS、DTS。
I帧

I帧又称帧内编码帧,是一种带有图画悉数信息的独立帧,因而,I帧无需参阅其它帧便可独立进行解码,这儿能够简略理解为一张静态画面。视频序列中的第一个帧一直都是I帧,由于它是要害郑

P帧

P帧又叫做帧间猜测编码帧,需求参阅前面的I帧或P帧才干进行编码。表明的是当时帧画面与前一帧(前一帧或许是I帧也或许是P帧)的不同。解码时需求用之前缓存的画面叠加上本帧界说的不同,生成终究画面。与I帧比较,P帧一般占用更少的数据位,但缺乏是,由于P帧对前面的P和I参阅帧有着杂乱的依耐性,因而容错性比较低。

B帧

B帧又称双向猜测编码帧,也便是B帧记载的是本帧与前后帧的不同。也便是说要解码B帧,不只要获得之前的缓存画面,还要解码之后的画面,经过前后画面的与本帧数据的叠加获得终究的画面。B帧压缩率高,可是对解码功能要求较高。

DTS(Decoding Time Stamp):即解码时刻戳,播映器运用该值核算在什么时候解码这一帧的数据。
PTS(Presentation Time Stamp):即显现时刻戳,播映器运用该值核算在什么时候显现这一帧的数据。

关于音频来说,DTS和PTS是相同的,可是关于视频流来说,不存在B帧,其DTS和PTS也是相同,假如存在B帧,则DTS和PTS就会不相同。

2. 视频编码

视频编码什么情况会用到呢?
比方咱们把一种视频格局转换到别的一种有或许会用到,对音视频的录制保存也会对音视频先进行编码,然后存储到文件或发送到服务器,其实,在FFMpeg中,音视频的编码和音视频的播映,在流程上比较相似,下面先看看音视频编码的全体流程图。
FFmpeg开发教程 --- 音视频播映和编码流程

上图红框里的流程视频编码和音频编码都是相同的,循环处理直到把一切需求编码的数据处理完,然后退出,接着调用av_write_trailer写入尾部文件信息。

上面调用的函数比较简略,咱们首要说下视频和音频编码参数的装备,这个比较要害,由于咱们具体要把数据编码成什么格局,涉及到编码后数据的巨细和解码。

其间关于音视频流都必须要初始化AVCodexContext结构,这个结构能够从流AVStream中的codecpar里仿制过来,因而,咱们只说结构AVCodexContext的参数装备。

音频编码参数:

codec_type:AVMEDIA_TYPE_AUDIO;

codec_id:假如是AAC编码,填充AV_CODEC_ID_H264,其它参阅AVCodecID界说;

codec_tag:填充为0;

bit_rate:比特率(每秒传输的bit数)64000表明64KB;

bits_per_coded_sample:表明每个采样点可编码运用多少位存储,一般是0,关于ADPCM能够是4或8,这儿填充0;

bits_per_raw_sample:原始每个采样点运用多少位存储,关于音频来说,能够是8、16、24、32等,这个值和sample_fmt有关;

format:图画像素格局,由AVSampleFormat界说的,这儿填充AV_SAMPLE_FMT_S16 ;

channel_layout:声道通道数摆放方法

channels:声道通道数,其实由channel_layout能够核算出其通道数的,这儿填充2;

frame_size:每帧有多少个采样点

initial_padding:在开端处的一段填充数据,能够设置为0,能够设置为frame_size巨细;

视频编码参数:

codec_type:AVMEDIA_TYPE_VIDEO;
codec_id:假如是h264编码,填充AV_CODEC_ID_H264,其它参阅AVCodecID界说;
codec_tag:填充为0;
bit_rate:比特率(每秒传输的bit数)250600表明250KB;
bits_per_coded_sample:表明每个采样点编码运用多少位存储,关于视频流来说,比方RGB24,这个值是24,由于每个采样点包含三个重量R、G、B;
bits_per_raw_sample:原始每个采样点位深度,关于视频流来说便是每个色彩重量占用的位数,关于RGB24,便是8,因而这个值和format有关,由具体编码器依据format核算,也能够这样核算pixdesc = av_pix_fmt_desc_get(format); bits_per_raw_sample = pixdesc.comp[0].depth;
format:图画像素格局,由AVPixelFormat界说的,这儿填充AV_PIX_FMT_YUV420P
width:图画宽度
height:图画高度

本系列文章均为原创,首要总结作者多年在软件职业的一些经历,和咱们一起学习、前进,转载请注明出处,谢谢!

 

 
 

本文地址:http://www.cvmachine.com/a/question/100266.html
Tags: 开发 教程 ffmpeg
修改:申博开户网
关于咱们 | 联络咱们 | 友情链接 | 网站地图 | Sitemap | App | 回来顶部