一,视频播放器原理
播放一个视频文件流程如下:
二,信息查看工具
- 综合信息查看工具
MediaInfo - 二进制信息查看
UltraEdit - 单项详细描述
封装格式:Elecard , Format , Analyzer
视频编码数据:Elecard,Stream,Eye
视频像素数据:YUV,Player
音频采样数据:Adobe,Audition
三,视频格式
- 封装格式:AVI,MP4,ASF
-编码格式:H264,wmv,XviD(音频:acc Mp3)
- 封装格式的作用:
视频码流和音频码流按照一定的格式存储在一个文件中。
- MPEG-4:
是一套用于音频、视频信息的压缩编码标准
- 封装格式分析工具:
Elecard Format Analyzer
- MPEG2-TS格式简介:
不包含头文件,数据大小固定(188Byte)的TS packet构成。
- FLV格式简介:
包含头文件,数据大小由不固定的Tag构成。
视频编码数据
- 视频编码的作用:
将视频像素数据(RGB,YUV等)压缩为视频码流,从而降低视频的数据量。
- H.264格式简介:
数据由大小不固定的NALU构成。
最常见的情况下,1个NALU存储了1帧画面的压缩编码后的数据。
- H.264压缩方法:
比较复杂。包含了帧内预测、帧间预测、熵编码、环路滤波等环节构成。
可以将图像数据压缩100倍以上。
四,音频编码数据
1. 音频编码的作用:
将音频采样数据(PCM等)压缩成为音频码流,从而降低音频的数据量。
2. AAC格式简介:
数据由大小不固定的ADTS构成。
AAC压缩方法可以将音频数据压缩10倍以上。
四,音频编码数据
1. 视频像素数据作用:
保存了屏幕上每个像素点的像素值。
2. 格式:
常见的有:RGB24,RGB32,YUV420P,YUV422P,YUV444P等。
压缩编码中一边拿使用的是YUV格式的像素数据,作为常见的格式为:YUV420P
3,特点:
视频像素数据体积很大,一般情况下1小时高清视频的RGB24格式的数据体积为(设帧率25Hz,采样精度8Bit):
3600*25*1920*1080*3 = 559.8GByte
4,RGB格式简介:
彩色图像中每个像素点由R、G、B三个分量组成。
以RGB24为例,图像像素数据的存储方式如下:
从图可知,RGB24以此存储了每个像素点的R、G、B信息。
RMB文件存储的就是RGB格式的像素数据。
5,YUV格式简介:
5,音频采样数据:
6,ffmpeg.exe的使用
1. 命令格式:
功能:ffmpeg.exe用于视频的转码。
ffmpeg -i input.avi -b:v 640k output.ts
将当前文件夹下的input.avi 文件转换为output.ts文件,并将output.ts 文件的码率设置为640k.
命令格式:ffmpeg -i 【输入文件路径】 -b:v 【输出视频码率】 【输出文件路径】
所有的参数都是以键值对应的形式指定的。
例如:输入文件参数是“-i” ,参数值是文件路径;输出视频码率参数是“-b:v”,而参数值是视频的码率值。
注意:位于最后面的输出文件路径前面不包含参数名称。
2. 命令参数:
7,ffplay.exe的使用
1. 命令格式:
功能:用于视频的播放
ffplay input.avi
播放当前文件夹下的input.avi 文件。
命令格式:
ffplay [输入文件路径]
参数格式与ffmpeg.exe类似。所有的参数都是以键值对应的形式指定的(由于不包含输出文件,所以只能指定输入参数)
2. 快捷键:
q,ESC :退出
f : 全屏
p,空格 :暂停
鼠标点击屏幕 :跳转到指定位置
8,视频解码知识
- 纯净的视频解码流程:
压缩编码数据 --> 像素数据
例如解码H.264,就是“H.264码流 --> YUV”。
- 一般的视频解码流程:
视频码流一般存储在一定的封装格式中(MP4,AVI),通常还包含音频码流等内容。
对于封装格式中的视频,需要先从封装格式中提取视频码流,然后再进行解码。
例如:家=解码MKV格式的视频文件,就是“MKV – > H.264码流 --> YUV”.
9,ffmpeg开发环境的搭建
1. 新建控制台项目
打开VC++ -> 文件 -> 新建 -> 项目 -> Win32控制台项目
2. 拷贝ffmpeg开发文件
头文件(.h)拷贝到项目文件夹下的include子文件夹下
导入库文件(.lib)拷贝至项目文件夹下的lib子文件夹下
动态库文件(*.dll)拷贝至项目文件夹下
3. 配置开发文件
1,打开属性面板:
2,头文件配置:
配置属性 ,C/C++,常规,附加包含目录,输入“include”(刚才拷贝的头文件的目录)
3. 导入库配置:
配置属性,链接器,常规,附加库目录,输入"lib"(刚才拷贝库文件的目录)。
配置属性,链接器,输入,附加依赖项,输入“avcodec.lib;avformat.lib;avutil.lib;avdevice.lib;avfilter.lib;postproc.lib;swresample.lib;swscale.lib”(导入库的文件名)
4. 动态库不用配置
4. 测试
1,创建源代码文件
在工程中创建一个包含main()函数的c/C++ 文件
2,包含头文件
C语言中使用ffmpeg,使用该代码:
#include “libavcodec/avcodec.h”
C++ 使用:
#define __SIDC_CONSTANT_MACROS
extern "C"
{
#include “libavcodec/avcodec.h”
}
3,main()中调用一个FFmpeg的接口函数:
int main()
{
printf("%s",avcodec_configuration());
return 0;
}
//若运行无误,代表ffmpeg配置完成