阶段性学习总结--ffmpeg

阶段性学习总结

        .自接触这个新鲜事物FFmpeg以来,前后也有近两个月的时间。那么为什么我会接触到这个软件呢?两个月的时间,我学习到了什么呢?仔细理了一下思绪,大致可以从了解,运用,学习,设标,验证,收获这六个方面来叙述。

1. 了解概况

1.1、 了解背景

起先接收到的任务是用FFmpeg软件生成一段h264的测试码流和学习FFmpeg的使用。
那么什么是FFmpeg呢?官网上的解释是A complete,cross-platform solution to record, convert and stream audio and video,翻译过来就是一个用于记录、转换和流式传输音频和视频的完整跨平台解决方案。
根据字面的意思,我将它理解为用来记录、转换数字视频、音频,能够将它们转换为流的一套可跨平台使用的工具。
什么是h264码流呢?书上解释为H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准。这个标准通常被称之为H.264/AVC,而明确的说明它两方面的开发者。
我从字面将其理解为h264是在压缩和传输方面具有更高效率的编码器,较其他编码其相比,因这两个有点被广泛应用。

1.2、 了解作用

FFmpeg有非常强大的功能,核心功能包括视频采集,视频格式转换,视频抓取图片,添加水印等等。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,源文件中里面的很多文件都是从头开发的。我要学习的主要是H264视频码流的转换和分析。FFmpeg项目是由可执行文件和源文件两部分组成的:
以下部分是可执行文件:
ffmpeg  视频文件转换命令行工具。
ffserver  基于HTTP、RTSP用于实时广播的多媒体服务器,也支持时间平移(PS:没用过)
ffplay   用SDL和FFmpeg库来开发的一个简单的媒体播放器
以下部分是源:
libavcodec  一个包含了所有FFmpeg音视频编解码器的库,为了保证最优性能和高可复用性,大多数编码解码器从头开发的。
libavformat  用于各种音视频封装格式的生成和解析
libavfilter  filter音视频滤波器的开发
libavutil  包含一些公共的工具函数的使用库
libavsample  音视频封装编码格式预设
libswzesample 原始音频格式转码

1.3、 了解概念

提到视频编码,那么其中的一些基本概念就不得不提了。
码率,比特率(码率)是一个确定整体视频/音频质量的参数,和视频质量成正比。
帧,就是一副静止的画面。常说的帧数,就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器在每秒钟能够刷新几次,通常用fps(Frames Per Second)表示,也就是帧率。
分辨率,指视频宽高的像素数值。通常视频分辨率的数值宽高比要等于画面比例,不然视频文件就会产生黑边。标准1080P的分辨率为1920×1080,帧速率为60fps,也就是真高清。
码率,比特率是指每秒传送的比特(bit)数。比特率越高,传送数据速度越快。
容量,容量 = 码率 * 时间。这里的码率说的是视频码率+音频码率
比如一个文件20.8M,时长1分钟,那么,码率就是:
biterate = 20.8Mbit*8/60s = 20.8*1024*1024*8 bit/60s= 2831Kbps,一般音频的码率只有固定几种,比如是128Kbps,那么,video的就是  video biterate = 2831Kbps -128Kbps = 2703Kbps。
I、B、P帧
I帧,即关键帧。关键帧是,构成一个帧组(GOP,Group of Picture)的第一个帧。
P帧,即未来单项预测帧,只储存与之前一个已解压画面的差值。 
B帧,即双向预测帧,除了参考之前解压过了的画面外,亦会参考后面一帧中的画面信息。
(注意点:参数概念一定要搞清楚,非常重要)

1.4、 了解句法

H264的句法比较多,在SPS(Sequence Parameter Set)中常见的如下:
(profile_idc):档次(baseline、main、extend、high)
(cosntraint_set0_flag)(cosntraint_set1_flag)(cosntraint_set2_flag)(cosntraint_set3_flag)四个约束句法,0可以不遵从相关简表规定
(reserved_zero_4bits)预留4个0的位置
(level_idc)级别
(分别是1、1.1、1.2、1.3//2、2.1、2.2//3、3.1、3.2//4、4.1、4.2//5、5.1)
(seq_parameter_set_id)序列参数集ID=0
(chroma_format_idc)色度格式
(bit_depth_luma_minus8)亮度比特=8 bits,亮度量化参数范围偏移
(bit_depth_chroma_minus8)色度比特=8 bits,色度量化参数范围偏移
(qpprime_y_zero_transform_bypass_flag)不使用变换旁路操作
(seq_scaling_matrix_present_flag)默认缩放比例列表
(log2_max_frame_num_minus4):最多帧数=2^4=16
(pic_order_cnt_type)图像顺序类型
(log2_max_pic_order_cnt_lsb_minus4)最大图像顺序数低位=2^4=16
(num_ref_frames)参考帧的最大数
(gaps_in_frame_num_value_allowed_flag)帧数差异标记
(pic_width_in_mbs_minus1)图像宽度
(pic_height_in_map_units_minus1)图像高度
(frame_mbs_only_flag)只是帧宏块,没有场宏块
(direct_8x8_inference_flag)B帧 运动矢量计算时用
(frame_cropping_flag)帧剪切偏移参数
(vui_parameters_present_flag)有VUI信息,默认矩阵系数2
一般情况下在sps中,能经常性用到的句法元素就是这么20句左右,不排除其他会用到的句法,但是都是比较少的。当然还有pps句法,这里就不一一列举了。


2. 设计目标

2.1、 设计目标

借用ffmpeg能够完成什么呢?从之前叙述的作用来看,ffmpeg可以实现的功能太多太多。那么我根据自己使用情况频率设计了以下两个小目标:
(1)、对视频的格式进行转换;
(2)、对句法元素值进行精确控制;

2.2、 设计内容

所有的目标都可以在linux大环境下进行,首先下载该应用软件,搭建软件应用环境;然后通过资料来查看ffmpeg软件的参数有那些;了解参数的作用;参数组合使用,实现相应的功能;检测相应的生成结果,利用工具判断最后结果是否符合预期,若不符合,则说明不符合点,以及原因,若符合,则保存证明数据和结果。

3. 学习工具

3.1、 学习FFmpeg

之前也说到FFmpeg软件中包含了大量的从头开发的库文件,方便代码的移植。比较麻烦的是操作基于命令行,操作相对比较复杂,这是所有的命令行文件所具有的问题,但也因为是基于命令行所以变化的更加灵活。
下载的该工具的时候我们选择Linux版本,其中只包含了几个个可执行文件(ffmpeg、ffprobe、ffplay、ffserver)。
命令语法如下:
ffmpeg [global_options]{[input_file_options
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值