我的音视频开发大部分内容是跟着雷霄骅大佬学习的,所以笔记也是跟雷老师的博客写的。
音视频基础
首先播放一个视频文件的流程如下所示:
先对封装的文件格式进行解封装操作,分别解压出音频数据和视频视频,然后进行音频的解码和视频解码分别获取到音频采样数据和视频像素数据,最后进行音视频的同步播放。
FFmpeg的作用就是将H.264格式的数据转换成YUV格式的数据,然后SDL将YUV显示到电脑屏幕上,FFmpeg可以用来、转码、压缩、剪辑、滤镜、水印、录屏、Gif等用途。SDL(Simple DirectMedia Layer)库的作用就是封装了复杂的视音频底层交互工作,简化了视音频处理的难度。
开发环境配置:如果是在Linux环境下开发,可以使用gcc编译器,并确保包含FFmpeg和SDL的头文件和库文件。在编译时,需要链接FFmpeg和SDL的库,例如使用-lavformat -lavcodec -lswscale -lavutil -lSDL2等编译选项。
常用播放器:
跨平台系列(非DirectShow框架):VLC、Mplayer、ffplay
Windows系列(DirectShow框架):完美解码、终极解码、暴风影音
信息查看工具:
综合信息:MediaInfo
二进制信息:UltraEdit
单项详细分析:
封装格式:Elecard Format Analyzer
视频编码数据:Elecard Stream Eye
视频像素数据:YUV Player
音频采样数据:Adobe Audition
封装格式:视频码流和音频码流按照一定的格式存储在一个文件中。
视频编码:将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量
音频编码:将音频采样数据(PCM等)压缩成为音频码流,从而降低音频的数据量。
视频像素数据:保存屏幕上每个像素点的像素值。格式有RGB24,RGB32,YUV420P,YUV422P等,压缩编码中一般使用的是YUV格式的像素数据,最为常见的格式为YUV420P。
视频像素数据体积很大,一般情况下1小时高清视频的RGB24格式的数据体积为:
3600*25*1920*1080*3=559.9GByte PS:这里假定帧率为25Hz,取样精度为8bit。
音频采样数据:保存了音频中每个采样点的数据。音频采样数据体积很大,一般情况下一首4分钟的PCM格式的歌曲体积为
4*60*44100*2*2=42.3MByte PS:这里假定采样率为44100Hz,采样精度为16bit。