ffmpeg是个音视频转换软件。比如你有个good_movie.avi文件,你可以用ffmpeg.exe把里面的音轨抽出来保存为.mp3, .m4a等文件。你还可以把分辨率从1920x1080(1080p)变成720p、提高压缩比,最终减少文件的大小(以图像变模糊为代价)。ffmpeg调用一大堆库(.dll或.so),你还可以在自己的程序里调用它。许多影音播放软件都用了ffmpeg。
AVS, AVS2, AVS3, H.265, H.264, MPEG等等是视频压缩标准,AAC, MP3等等是音频压缩标准。AVI、MKV, MP4等是文件格式。一个文件里可以有一个视频流,多个音频和字幕流。MP4也是个视频压缩标准。AVS是我国具备自主知识产权的第二代信源编码标准。"超高清视频多态基元编解码关键技术"荣获2020年度国家技术发明奖一等奖。
如何压缩视频?首先,连续的各帧变化不大,相减后会出现许多0。不用传送0000000...,而是传送1000, 0这两个数就可以。如果视频中的人挥一下手,编码器能找到运动向量,依然产生很多0。其次,人眼对亮度比对颜色敏感,把RGB(红绿蓝)变成YUV/YCbCr表示,2个或4个像素共享颜色信息,也可以进行压缩。In YCbCr, the Y is the brightness (luma), Cb is blue minus luma (B-Y) and Cr is red minus luma (R-Y).
codec [ˈkəʊdek] a device or program that compresses data to enable faster transmission and decompresses received data
纯软件编码很费时。但软件可以"调用"硬件来编码。显卡和手机上的SoC(System on chip,n合1)都有这个功能,但不是所有的格式都支持。
如何显示YCbCr格式的图像?OpenGL, Direct3D, DirectX等都有利用硬件进行加速的功能。我们看到的屏幕,可以想象成是若干层叠起来的。层叫surface或其它。层有显示的,也有隐藏的。可以先"在背后"画好YUV格式的,缩放和与其它层显示交给硬件。
如何播放声音?看到这里你已经找到正经网站了吧,再说我也不会。:-)
CPU也有特殊的指令(SIMD, 单指令多数据),如一条指令把16个8位二进制数加起来,可以使编解码变快。