视频解码学习备忘

2023-11-11

媒体文件知识

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

首先是视频容器,就是所谓的.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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

视频解码学习备忘 的相关文章

  • java浮点数转二进制_浮点数转换成二进制

    因为要参加软考了 当然也只有考试有这种魅力 我得了概浮点数转化为二进制表示这个最难的知识点 个人认为最难 俺结合大量的从网上收集而来的资料现整理如下 希望对此知识点感兴趣的pfan有所帮助 基础知识 十进制转十六进制 十六进制转二进制 IE
  • Git恢复本地误删文件

    转 https www cnblogs com yangshifu p 9680993 html Step 1 git status Step 2 git reset HEAD 被删除的文件或文件夹 Step 3 git checkout
  • vuex 是什么? 有哪几种属性?

    Vuex 是一个专为 Vue js 应用程序开发的状态管理模式 简单点说 方便父子组件及组件之间的数据传递 有 5 种 分别是 state getter mutation action module vuex 的 store 是什么 vue
  • MIDP对应的设备特性(转)

    由于MID这类设备 在屏幕 内存 处理器等问题上有诸多限制 在手机或是PDA等MID上开发应用程序必须要考虑一些技术上的特殊点 下面给出一些MID设备的特性 显示 display 96x54 最小屏幕尺寸 1bit 最小色深 单色 输入设备
  • 工具网页收藏

    腾讯文档 百度脑图 墨者写书 语雀文档 阿里图标库 百度图说 腾讯智图 百度Suger数据可视化 腾讯设计导航 135设计 极速app 小程序开发 墨刀 processon visio axure mockplus sketchcn 其他i
  • 子序列(组合数学)

    子序列 题目描述 给出一个长度为 n n n的序列 你需要计算出所有长度为 k k k的子序列中 除最大最小数之外所有数的乘积相乘的结果 输入描述 第一行一个整数
  • maven学习笔记(五)maven全局配置文件settings.xml详解

    目录 setting文件简介 settings xml的作用 settings xml文件位置 配置的优先级 settings xml元素详解 顶级元素概览 LocalRepository InteractiveMode UsePlugin
  • Shiro权限框架-Springboot集成Shiro(5)

    1 技术栈 主框架 springboot 响应层 springMVC 持久层 mybatis 事务控制 jta 前端技术 easyui 2 数据库设计 1 数据库图解 sh user 用户表 一个用户可以有多个角色 sh role 角色表
  • python arima predict end无效_样本外预测的ARMA.predict不适用于浮点?

    在我开发了用于样本分析的小ARMAX预测模型之后 我想预测一些样本外的数据 我用于预测计算的时间序列从2013 01 01开始 到2013 12 31结束 以下是我正在处理的数据 hr np loadtxt Data 2013 17 txt

随机推荐

  • 《深入浅出数据分析》R语言实用教程

    深入浅出数据分析 R语言实用教程 1年前的R语言笔记 跟着 深浅 学习 当时用的版本是R i386 4 0 3 因为先学了MySQL再学的R 所以会夹带一些在借助MySQL来理解 1 基本处理 先加载程序包 程序包 加载程序包 加载xlsx
  • (二)、edtFTPj FileTransferClient

    edtFTPj的FileTransferClient类简单易用 而且下载的组件包中文档丰富 参考使用 完全能满足自己需要 下载地址为 http www enterprisedt com index html 废话不多说 上代码 Java代码
  • 监督学习,无监督学习,半监督学习,主动学习的概念

    1 监督学习 supervised learning 训练数据既有特征 feature 又有标签 label 通过训练 让机器可以自己找到特征和标签之间的联系 在面对只有特征没有标签的数据时 可以判断出标签 即生成合适的函数将输入映射到输出
  • 高斯噪声与高斯滤波

    噪声 噪声表现形式 噪声在图像上常表现为一引起较强视觉效果的孤立像素点或像素块 一般 噪声信号与要研究的对象不相关 它以无用的信息形式出现 扰乱图像的可观测信息 通俗的说就是噪声让图像不清楚 噪声对数字图像的影响 对于数字图像信号 噪声表为
  • 深度优先查找和广度优先查找

    深度优先查找和广度优先查找 在人工智能和运筹学的领域中求解与图有关的许多应用中 这两个算法被 证明是非常有用的 并且 如需高效地研究图的基本性质 例如图的连通性以及图是否存 在环 这些算法也是必不可少的 深度优先查找 深度优先查找可以从任意
  • python之cv2与图像的载入、显示和保存

    本文是OpenCV 2 Computer Vision Application Programming Cookbook读书笔记的第一篇 在笔记中将以Python语言改写每章的代码 PythonOpenCV的配置这里就不介绍了 注意 现在O
  • shell-if语句详解

    if 条件 then Command else Command fi 别忘了这个结尾 If语句忘了结尾fi test sh line 14 syntax error unexpected end of fi if 的三种条件表达式 if c
  • navigator.geolocation.getCurrentPosition在谷歌浏览器不执行的问题

    在React 中使用navigator geolocation getCurrentPosition去获取定位信息时 获取地理位置信息 navigator geolocation getCurrentPosition position gt
  • 初识SQL workbench

    一 workbench 下载地址 https dev mysql com downloads workbench 二 环境变量配置 双击安装包 点击 Next 进行安装 重要提醒 请截图保留安装界面中 见下图 红色框起来的地址 图1 记住安
  • 3打包生成dist文件夹并发布到服务器

    打包生成dist文件夹并发布到服务器 打包生成dist文件夹 npm run build 发布1 使用静态服务器工具包 安装serve npm install g serve serve dist 访问 http localhost 500
  • mac下搭建编译chromium的开发环境

    本篇为 mac 下搭建编译chromium的方法 windows篇 windows下搭建编译chromium的开发环境 二七 CSDN博客 linux篇 linux 搭建和编译 chromium 环境 二七 CSDN博客 系统环境 mac
  • 如何实现自定义MVC框架(最终版本)

    目录 一 将MVC框架源码导成jar包 1 1优化的思路 1 2具体步骤 二 创建需要的工具包 分析思路 具体的代码 三 总结 前言 我们通过框架的形式实现一个具有增删改查的网页 一 将MVC框架源码导成jar包 1 1优化的思路 相比我们
  • Selenium自动化测试简介

    IT赶路人专注分享跟IT相关的各种知识 希望我们一起学习 共同成长 Selenium自动化测试 很早就想跟大家分享 在15年开始 我们的团队就在使用这个工具 最初 我们使用的语言是Java和SQL的结合 随后 随着最近几年Python语言的
  • Leetcode 219. Contains Duplicate II (hashmap 和 sliding window)

    Contains Duplicate II Easy Given an integer array nums and an integer k return true if there are two distinct indices i
  • ElasticSearch 绑定IP地址

    https blog csdn net yelllowcong article details 78740237
  • Dx11--用dx11绘制棱台,并用键盘和鼠标进行旋转缩放操作

    目录 一 索引缓冲区 前言 创建缓冲区 缓冲区的描述 二 常量缓冲区 前言 准备工作 正式初始化 画面更新及其效果 画面更新 效果 三 键盘和鼠标的创建 1 鼠标的创建 2 键盘的创建 3 更新画面 4 消息回调函数 处理键盘鼠标信息 效果
  • Python协程介绍【赠书活动|第五期《Python编程入门与实战》】

    文章目录 一 相关概念 1 协程 2 子程序 3 区别 4 协程的优势 二 示例 赠书活动 一 相关概念 1 协程 协程 又称微线程 纤程 英文名Coroutine 协程的概念很早就提出来了 但直到最近几年才在某些语言 如Lua 中得到广泛
  • LeetCode : Search for a Range

    Given a sorted array of integers find the starting and ending position of a given target value Your algorithm s runtime
  • Centos7安装jdk1.8

    Centos7安装jdk1 8 两种安装方式 1 检查本机是否安装了jdk 安装了就不用安装了 命令如下 root localhost java version bash java 未找到命令 root localhost 注意 说明未安装
  • 视频解码学习备忘

    媒体文件知识 日常都是播放器直接播 其实这里面还有不少内容的 首先是视频容器 就是所谓的 mp4 mkv 这类文件 其目的主要就是用来存放音频视频字幕等内容 所以叫做容器 这些都有一定规范 比如mp4 叫ISO 14496 12 也即是mp