媒体文件知识
日常都是播放器直接播,其实这里面还有不少内容的。
首先是视频容器,就是所谓的.mp4 .mkv 这类文件,其目的主要就是用来存放音频视频字幕等内容,所以叫做容器。这些都有一定规范,比如mp4,叫ISO 14496-12,也即是mpeg-4 part12。这类规范可以直接百度或者google。
bm6j80:~/桌面$ file 4k烤鸭.mp4
4k烤鸭.mp4: ISO Media, MP4 Base Media v1 [IS0 14496-12:2003]
其次是存放在容器里的视频文件,已H264视频为例,有2层,NAL(网络抽象层),VCL(视频编码层)。从mp4里面把视频抽取出来得到的文件就是NAL序列,这个过程就是demux,解复用。
file stream/*
stream/avc: directory
stream/avc_main10: directory
stream/avc_uhd_cavlc_8b_04.cfg_0.264: JVT NAL sequence, H.264 video @ L 52
stream/hevc: directory
stream/hevc_fhd_inter_8b_11.cfg_0.265: data
stream/hevc_main10: directory
stream/inter_8b_11.cfg.265: data
这个里面 stream/avc_uhd_cavlc_8b_04.cfg_0.264: JVT NAL sequence, H.264 video @ L 52 这一行的avc_uhd_cavlc_8b_04.cfg_0.264 就是抽取出来的视频,用file看就是NAL序列。这个序列也是可以直接用播放器播放的,只不过没声音而已。
ffmpeg -i 4k烤鸭.mp4 -vcodec copy -vbsf h264_mp4toannexb -an 4k.h264
我实际播放这个4k烤鸭提取的文件会报错,应该是某些信息提取过程被丢失。(暂不深入,目前已理解原理为主要目标)
再然后就是解码出来的裸数据了,一般都是yuv格式,关于yuv格式的知识,可以参考
YUV 格式详解,只看这一篇就够了(转) - 知乎介绍 音视频领域的人恐怕没有人不知道 YUV,但是 YUV 本身有好多种变种,名称也各种各样,本文就位大家总结一下YUV 的各种格式。 在开始之前,先向大家介绍一款 YUV 图像的查看工具---YUV Eye,大家可以使用这个工…https://zhuanlan.zhihu.com/p/384455058这一篇就够了,为啥不用RGB,我简单查了下,主要还是节省了大量空间,毕竟RGB单个像素需要24bit来存放一个像素。YUV存储亮度蓝色红色分量,按存储大小大概分为YUV420 422 444三种,再细分就只是存储Y和UV的顺序不同了。看参考文档就行。
How to find out resolution and count of frames in YUV 4:2:0 file? - Stack Overflowhttps://stackoverflow.com/questions/19677747/how-to-find-out-resolution-and-count-of-frames-in-yuv-420-file
所谓的视频解码也基本是h264编码的数据解码城yuv裸数据的过程,解码器主要工作也是这一步。
解压出来的yuv裸数据,可以通过
ffplay -f rawvideo -video_size 1920x1080 /tmp/hevc_fhd_inter_8b_11.cfg_0.yuv
这样的命令来播放,也可以通过yuv查看软件来查看,我自己查看的
nullhttps://github.com/gbaruffa/pyuv-player这个是pyuv,能播放,但是貌似不能一帧一帧查看。
国内有大佬出了个YUVEye,非常好用,能一帧一帧的看,但需要免费注册一下。
YUVEye官方下载-ZigZagSinYUVEye是一款免费好用的YUV图像分析软件,你可以用他来查看 YUV 图像数据,验证数据准确性,对比原始图像质量,查看图像直方图等操作。https://www.zzsin.com/YUVEye.html以上就是整个视频播放器的播放视频涉及的几个阶段。
Linux媒体播放框架
前面的媒体文件播放,基本上靠ffmpeg这个框架就能完全搞定(除了播放,ffmpeg当然支持编码了),它还支持了很多的硬件加速编解码器。
同时,linux上还有个gstreamer,也是一个媒体框架,基于插件机制的,他可以让ffmpeg作为一个插件使用。
关于ffmpeg gstreamer的区别,参考
gstreamer(一)入门和概述_江海细流的博客-CSDN博客_gstreamer一.概述在音视频领域接触最多实现的方案通常是通过ffmpeg(PC和sever端居多)或者硬件厂家的的SDK实现特定硬件的编解码功能(机顶盒,电视等嵌入式设备)。这里我们介绍一个在国内不太常用的解决方案----gstreamer媒体库二.Gstreamer 的特点:gstreamer跟ffmpeg一样,也是一个媒体框架,可以实现采集,编码,解码,渲染,滤镜等一条龙的媒体解决方案。跟ffmpeg一样,也是有命令行工具进行测试验证。同时还可以通过代码框架直接封装命令来做工程开发,这一点ffmhttps://blog.csdn.net/fengliang191/article/details/108436699这两个框架本身也带了一些命令行工具,功能都已经很强大了。
其他问题,想到了再记录。目前就是为了扫个盲。