附加: FFmpeg概念理解

附加: FFmpeg概念理解,第1张

FFmpeg 是非常强大的多媒体编解码框架,堪称多媒体处理的瑞士军刀,是集录制,转码,流的完整的跨平台多媒体解决方案。本身涵盖了大量的多媒体处理工具。

而我们常说的视频,其实是包含的视频,音频甚至还有字幕的一个整体。因为视频本身是三维的数据,在计算中直接存储空间非常大,通常无法接受,所以,会对其进行一些编码和压缩,这个过程通常是有损的,但却极大了降低了它的存储空间。

视频数据相比位图数据多了一维,但其本身还是由像素点组成。

编码、压缩在流媒体领域是一项非常重要的技术:从 H264码流 到 YUV流 的过程称为 解码 ,反之称为 编码 。

帧是流的基本元素,即视频流中的图像。在原始流里,各帧都一样。但经过编码压缩后的帧,通常分为下面几种:

注意:I、P、B帧,并不是依据视频帧数据内部的元素的不同来区分的,从解码后的帧本身而言,它们没有任何区别。仅仅是在编码时,对帧处理的方式不同而已。

首先视频文件与视频编码格式是两个概念。

一般包括以下部分:

FFmpeg 处理视频转码时的常规过程如下:

各自状态的数据产物如下:

视频中会有音频,视频,它们在文件有各自的编码压缩方式,但为了传输过程方便,将压缩过的音频和视频捆绑在一起进行传输。首先就需要将媒体文件中的各个音频,视频,字幕流等分开。

这一步叫Demux(解复用)。总结就是把不同的流从某种容器(文件)中解析出来。如上图所示,并且,一个媒体文件中,还可以分别有不止一个音频,视频和字幕流。

媒体数据为了降低存储量,针对里面的音频,视频,字幕等都会采取特定方式的编码压缩。

这一步便对各自的流采用其对应的解码算法进行处理。得到原始流。

即这一步是以帧为单位实现压缩数据到原始数据转换。

这一步再按照目标的编码方式对流进行编码。即这一步是以帧为单位实现原始数据到压缩数据转换。

Demux的逆 *** 作,把不同的流按照某种容器的规则放入容器

按照编解码器的位置划分:

FFmpeg中filter分为:

因其仅有解码部分的硬件加速,缺少编码部分的加速。且Nvidia有单身以NVENC和NVDEC替代掉这一块的意思,这里不多做细节介绍。细节请看 文档

支持的格式有:

优点:

各种型号的设计支持情况请看 Video Encode and Decode GPU Support Matrix

查看硬件支持:

使用CUDA解码:

使用CUVID解码:

转码,使用NVDEC和NVENC

可以使用 -hwaccel_device <id> 指定GPU。GPU id可以通过 nvidia-smi 查看

该方案一般通过QSV来进行加速。QSV(Quick Sync Video)即Intel的集成加速,该方便优缺点如下:

优点:

查看CPU是否支持的方法如下:

该方案支持h264,h265,mjpeg,mpeg2video,vp8,vp9的编解码,和vc1的解码。

更细节的支持情况如下:

解码支持情况:

编码支持情况:

QuickSync对于编码解码在CPU使用率上都有着非常不错的提升。编码提升效果特别明显。

关于抽帧的各种表现,待之后测试补上。TODO

更多细节可以参考官方 文档

FFmpeg使用QSV加速的一些命令行参数可 参考

使用ffprobe提取出IPB帧的时间

抽取IPB帧到jpg:

抽帧流程其实与转码类似,一样是输入视频文件,对视频文件进行Demux,解码视频流,得到原始视频帧,然后挑选相应的视频帧按jpeg编码,mux输出到一个个文件中。

那么要加快抽帧的效率,便是想办法加快上面这各个阶段的速率

抽帧会伴随着大量的文件输出。在有很多抽帧任务并行时,理论上会对磁盘造成大量的随机写入。

其他途径优化:

结合以上各节点,这里列出一些进一步的调研方向:

此方案针对加快解码,加快编码。基于目前的信息来看:

该方案会有非常大的优化效果,若有足够支持QSV的CPU机器,那么该方案可行性非常大。

待进一步补充相关测试数据

同上,针对解码编码方面尝试加快进行优化。目前情况:

该方案理论上也应该会有不错的优化效果。但就目前的一些简单测试来看,即使能达到好的加速效果,其成本也未必能够接受

待进一步补充相关测试数据

该方案针对加快数据读取和数据输出。考虑的点主要是整个抽帧过程中是否对视频文件有不小量的随机读取,大量抽帧任务并行时,会有巨量的输出。这块是否会产生大量的随机写入,降低效率。

待进一步补充相关测试数据

该方案针对加解码(更确切地说是减少不必要的解码 *** 作)

例如对于一秒一帧的均匀抽帧,我们针对这种情况,修改为,尽量抽取每一秒中的关键帧。做个伪的一秒一帧的均匀抽帧。这种模式不一定能为所有抽帧情况加速,但若能为大头的需求加速也不错

待进一步测试验证可行性及补充相关测试数据

针对解码编码方面尝试加快进行优化。

ffmpeg中,同样格式可能有多个编码解码器,比如jpeg的就会有mjpeg,libjpeg等。不同的库实现,性能,质量会有一些差距,通过测试实验,改善参数,或许一定程度上能优化性能。

待进一步补充相关测试数据

针对流程的优化。如前面的单帧抽帧, -ss 参数的不同位置会影响 ffmpeg 抽取的时间。理论上,ffmpeg 本身设计是为了通用,而对于专用于抽帧的场景,ffmpeg本身可能存在一些没必要的工作,尝试通过参数和源码级别来优化,或许能省掉这部分的资源消耗。

待进一步补充相关测试数据

TODO

FFmpeg官网

3GP/MP4 视频文件格式解析及其播放原理(转)

FFmpeg视频抽帧那些事

FFmpeg原理和架构

FFmpeg 硬件加速方案概览 (上)

FFmpeg 硬件加速方案概览 (下)

FFmpeg wiki HWAccelIntro

视频和视频帧:FFMPEG+Intel QSV硬解的环境安装篇

视频和视频帧:视频和帧基础知识整理

以上就是关于附加: FFmpeg概念理解全部的内容,包括:附加: FFmpeg概念理解、C#如何获取视频文件的帧宽度、帧高度、FFmpeg调研报告等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9408243.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存