日常都是播放器直接播,其实这里面还有不少内容的。
首先是视频容器,就是所谓的.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的顺序不同了。看参考文档就行。
所谓的视频解码也基本是h264编码的数据解码城yuv裸数据的过程,解码器主要工作也是这一步。
解压出来的yuv裸数据,可以通过
ffplay -f rawvideo -video_size 1920x1080 /tmp/hevc_fhd_inter_8b_11.cfg_0.yuv
这样的命令来播放,也可以通过yuv查看软件来查看,我自己查看的
https://github.com/gbaruffa/pyuv-player
https://github.com/gbaruffa/pyuv-player这个是pyuv,能播放,但是貌似不能一帧一帧查看。
国内有大佬出了个YUVEye,非常好用,能一帧一帧的看,但需要免费注册一下。
YUVEye官方下载-ZigZagSinYUVEye是一款免费好用的YUV图像分析软件,你可以用他来查看 YUV 图像数据,验证数据准确性,对比原始图像质量,查看图像直方图等操作。https://www.zzsin.com/YUVEye.html以上就是整个视频播放器的播放视频涉及的几个阶段。
前面的媒体文件播放,基本上靠ffmpeg这个框架就能完全搞定(除了播放,ffmpeg当然支持编码了),它还支持了很多的硬件加速编解码器。
同时,linux上还有个gstreamer,也是一个媒体框架,基于插件机制的,他可以让ffmpeg作为一个插件使用。
关于ffmpeg gstreamer的区别,参考
其他问题,想到了再记录。目前就是为了扫个盲。
用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一样),就可以启用硬件解码了。参考
之前一直没认真研究,一个劲的想用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 参数
后续更多测试待续
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个条件
参考:
https://en.wikipedia.org/wiki/X_video_extension
$ 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
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
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
如何学习ruby的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/
目前我正在使用这个正则表达式从YoutubeURL中提取视频ID:url.match(/v=([^&]*)/)[1]我怎样才能改变它,以便它也可以从这个没有v参数的YoutubeURL获取视频ID:http://www.youtube.com/user/SHAYTARDS#p/u/9/Xc81AajGUMU感谢阅读。编辑:我正在使用ruby1.8.7 最佳答案 对于Ruby1.8.7,这就可以了。url_1='http://www.youtube.com/watch?v=8WVTOUh53QY&feature=feedf'url
深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG