视频解码学习备忘

媒体文件知识

日常都是播放器直接播,其实这里面还有不少内容的。

首先是视频容器,就是所谓的.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查看软件来查看,我自己查看的

https://github.com/gbaruffa/pyuv-playerhttps://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这两个框架本身也带了一些命令行工具,功能都已经很强大了。

其他问题,想到了再记录。目前就是为了扫个盲。

VLC的命令行参数

用vlc -H 能列出非常详细的命令行参数。

其中--codec 可以指定编解码器的列表, -vout 指定视频输出。这两个在配置嵌入式设备的时候应该有用,-l(小写L)列出所有模块。有时间继续测试.

J7110板子走的omx来调用硬件加速编解码模块,编译进去后目前还没生效。待下一步测试。

gstreamer的管道播放比较有意思也能比较好理解整个编解码流程,下一步多测试。

J7110硬件解码测试

ffmpeg的播放器播放,starfive官网的工程镜像已经放进去编译好的ffmpeg gstreamer omxil相关库和二进制文件,直接命令行就可以播放

ffplay     使用-vcodec h264_omx 指定视频解码器,ffmpeg 的libavcodec这个库包含了框架和音视频编解码器,starfive已经对ffmpeg做了更改,让libavcodec也包含了h264_omx hevc_omx  mjpeg_omx三个使用omxil的解码器。同时工程镜像也包含了修改好的omxil库,h264_omx会调用omxil库去使用内核vdec.ko等驱动物理硬件在/etc目录生成的vdec设备文件(有时候需要配置好权限,否则普通用户会报权限错误)

ffplay -vcodec h264_omx ~/Desktop/shengri.mp4

gstreamer

同样,starfive工程镜像提供了编译好的omxh264dec等等一系列库。按照官网的手册调用就是。

gst-launch-1.0 filesrc location=./Desktop/shengri.mp4 ! qtdemux ! h264parse ! omxh264dec ! videoconvert ! xvimagesink

VLC  vlc通过调用ffmpeg的编解码库 avcodec,并指定h264_omx(和ffplay一样),就可以启用硬件解码了。参考

Documentation:Modules/avcodec - VideoLAN Wikihttps://wiki.videolan.org/Documentation:Modules/avcodec/

之前一直没认真研究,一个劲的想用omx直接支持,编译了好几次并指定--codec omxil都不行,后面搜了下,发现vlc的modulel里面 codec omxil_core.c把库so文件名都写上了,估计要单独改,树莓派应该是单独做了修改,所以可以用boardcom的omx库加载。

/usr/local/vlc/bin/vlc --codec avcodec --avcodec-codec h264_omx --vout vdummy /home/user/Desktop/shengri.mp4

图形界面指定

在上面的图片ffmpeg 的codec name 里面写上h264_omx即可。

上面三种方式播放视频占用CPU都差不多在1个核左右,而且有图像输出的时候X占用基本在80%左右(gstreamer也只有xvimagesink可用,不知道内核开启FB后字符界面下fbdevsink CPU的占用会不会低一些),starfive官方也说了图形部分没弄好,估计优化余地不小。

有关VLC通用的VPU硬件解码参考:

VLC GPU Decoding - VideoLAN Wikihttps://wiki.videolan.org/VLC_GPU_Decoding/

vlc 打印详细信息 可以用命令行 启动加--verbose 2 参数

ffplay打印详细信息可以加-v verbose 参数

目前遇到杜比视界编码的h265无法播放,软解出来颜色不对

后续更多测试待续

vlc 转码在线视频流

对于某些在线会议的回放,一般提供m3u让浏览器播放,为了保存整个视频,可以通过抓m3u文件让vlc进行转码保存。

  • 抓m3u一般靠经验,浏览器F12,然后点到网络,过滤位置输入m3u,然后刷新在线播放页面。就会出现m3u文件的下载链接。或者直接在预览窗口拷贝内容在本地新建文件保存进去。
  • vlc转码,在VLC窗口,点媒体-转换/保存,弹出窗口中输入本地m3u或者直接网络链接,点转换/保存 ,在转换窗口设置配置文件配置视频编解码勾选保持原视频轨,音频同理,这样不需要做编解码动作,下载合并文件的速度非常快。
  • 实际测试,遇到m3u文件有#EXT-X-DISCONTINUITY标记的情况下,vlc会报错停止,把这个标记以前的删掉就可以正常保存了(如果在正片开始中间插入的几个这种标记就可能没办法了,只能完成完整的解码-编码-保存过程了,时间慢,机器卡了。),这个应该是软件bug,但也可能是因为没有重新编解码一次导致,可以尝试完成本地编解码动作。(容器用TS就解决了)

Gstreamer的各plugins

xvimagesink

xvimagesink:  xvimagesink: Video sink  

gstreamer的插件可以全部列出。

gst-inspect-1.0 | grep imagesink
ximagesink:  ximagesink: Video sink
xvimagesink:  xvimagesink: Video sink

查看详细信息

gst-inspect-1.0  --plugin xvimagesink

Plugin Details:
Name                     xvimagesink
Description              XFree86 video output plugin using Xv extension
Filename                 /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstxvimagesink.so
Version                  1.16.2
License                  LGPL
Source module            gst-plugins-base
Source release date      2019-12-03
Binary package           GStreamer Base Plugins (Ubuntu)
Origin URL               https://launchpad.net/distros/ubuntu/+source/gst-plugins-base1.0

xvimagesink: Video sink

1 features:
+-- 1 elements

看描述,这个是X的一个扩展,在Xorg.0.log里可以看到加载这个扩展的信息

grep -i xvideo /var/log/Xorg.0.log
[    13.994] (II) Initializing extension XVideo
[    13.995] (II) Initializing extension XVideo-MotionCompensation

这个扩展主要是用于在X下对视频数据显示做处理(缩放,颜色空间转换-yuv数据各类格式变换,亮度色差的调整等等,这些都是视频解码后的yuv裸数据后处理),需要显卡支持(所谓的2D加速部分功能,部分显卡会描述这部分功能),如果显卡不支持,则需要大量CPU来处理。

要启用xvideo,需要3个条件

  • 视频控制器必须提供所需的功能。  (显卡支持这个功能)
  • 视频控制器的设备驱动软件和 X显示服务器程序必须实现 XVideo 接口。(驱动和Xorg扩展。xvinfo可以查看驱动是否启用)
  • 视频播放软件必须使用这个接口。(gst 的xvideosink或者mplayer的 vo xv)

参考:

https://en.wikipedia.org/wiki/X_video_extension

4.1. Xv

ximagesink 

$ gst-inspect-1.0 --plugin ximagesink
Plugin Details:
Name                     ximagesink
Description              X11 video output element based on standard Xlib calls
Filename                 /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstximagesink.so
Version                  1.16.2
License                  LGPL
Source module            gst-plugins-base
Source release date      2019-12-03
Binary package           GStreamer Base Plugins (Ubuntu)
Origin URL               https://launchpad.net/distros/ubuntu/+source/gst-plugins-base1.0

ximagesink: Video sink

1 features:
+-- 1 elements

gstreamer使用进阶(转) - 走看看

  • ximagesink是用来显示视频图像的sink插件,它是基于X11库的,(简单点说ximagesink会调用XPutImage函数),XPutImage不支持yuv格式的数据,常用的就是rgb格式。
  • xvimagesink也是用来显示视频图像的sink插件,但是它是基于X Video Extension库的,(简单点说xvimagesink会调用XvPutImage函数),而XvPutImage则可能支持yuv格式的数据,这个显卡有关。

videoconvert

gstearmer的管道每一个组件颜色空间不一定一样,就算都是yuv的,也还有I420,NV12等等不同的空间使用比率和存储顺序分布。所以需要做色彩空间转换,videoconvert是纯软件,消耗CPU

This is the GStreamer software video colorspace converter. Because it is software based, it can output a whole slew of video formats:

Input type I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32 to output type I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32.

This converter is only recommended when the above cannot be used. Because it is software based, it's performance cost is very high.

http://trac.gateworks.com/wiki/Yocto/gstreamer/video#ximagexsinkxvimagesink

关于视频硬件解码的框架,除了VAAPI VDPAU 嵌入式常用的是OMX

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值