了解如何使用 ffmpeg 将任何视频转换为 YUV 原始视频,如何使用 ffplay 播放 YUV 文件,以及如何手动计算 YUV 文件的大小。
原始 YUV 视频在视频压缩研究或视频处理的早期步骤中通常非常重要。最好知道如何获取压缩和容器化的视频(如 AVI 或 MP4 文件)并从中提取原始视频。
在本教程中,让我们学习如何从 AVI 文件中提取原始 YUV 视频,然后使用 ffplay
. 作为奖励,我们还学习如何手动计算 YUV 文件的大小。
使用 FFmpeg 转换为原始 YUV 视频
让我们以 AVI 格式的视频为例,学习如何使用 FFmpeg 将其转换为 YUV。这样做的命令如下所示 –
ffmpeg -i input_720x480p.avi -c:v rawvideo -pixel_format yuv420p output_720x480p.yuv
这个命令是不言自明的。这就是你在做什么 –
- 向 FFmpeg 提供输入视频(在我的例子中,它是一个 AVI 文件
720x480p
,和24fps
) - 指定输出文件名(带
.yuv
扩展名) -c:v rawvideo
选择视频编解码器 (-c:v
) 并使用rawvideo
流说明符通过 FFmpeg 访问原始视频。- 指定
pixel_format
: 当您使用 时rawvideo
,您需要告诉 FFmpeg 所使用的像素格式是什么——是yuv420p
, 还是yuv422p
, 或者 FFmpeg 支持的许多像素格式中的任何一种。
就是这样——运行这个命令,你会得到原始的 YUV 视频。
但是,您应该小心,因为与输入的 AVI 或 MP4 文件相比,原始 YUV 文件往往很大。
当心 YUV 文件的大小
输出的 YUV 文件会很大,因为视频是未压缩的,文件只包含原始视频像素。
这就是我要说的——
$ ls -lh *720x480*
-rw-r--r--@ 1 krishna staff 6.1M Jul 2 14:23 input_720x480.avi
-rw-r--r-- 1 krishna staff 618M Jul 2 11:31 output_720x480.yuv
输入 AVI 文件是 6.1M
而输出 YUV 文件是 618M
. 我们正在谈论 618M
52 秒的剪辑 720x480p
。
1080p 60fps
现在,想象一下一个 1 小时长的视频将占用多少空间 ,对吧?如果您不小心,您可能会用完磁盘空间。
这就是视频压缩对任何视频服务都如此重要的原因!
使用ffplay播放YUV文件
大多数商业视频播放器无法播放 YUV 或原始视频文件。主要原因之一是 YUV 文件不是播放器可以识别的容器格式(即 mp4 或 avi)。所以播放器无法知道帧的大小、帧率、帧数、像素格式等。
但是,您可以 ffplay
通过指定一些命令行参数来播放 YUV 文件。 ffplay
是一个播放实用程序,基本上是一个 ffmpeg
带有附加代码的包装器,可以显示视频。
当您 ffmpeg
在 Windows/MacOS/Ubuntu 上安装时, ffplay
会自动安装(以及 ffprobe
– 一个惊人的文件分析器!)。
你需要告诉 ffplay
它单帧的大小、帧率、像素格式等,这样它才能正确解读单帧的大小和格式,然后继续播放视频。
这是使用 播放 YUV 视频的命令 ffplay
。在这一点上,参数是不言自明的。
ffplay -f rawvideo -pixel_format yuv420p -video_size 720x480 -i output.yuv
要控制 ffplay
,您可以使用 spacebar
暂停/播放、 f
在全屏和本机显示大小之间切换以及 arrow keys
向前和向后跳转。
这是 ffplay
显示的样子 –
正如您想象的那样,它非常基础,但是,毫无疑问 — ffplay
功能强大,当所有其他玩家都不喜欢您的视频时,它可以成为您最好的朋友。
为了巩固我们的理解,让我们向 提供错误的帧大小 ffplay
。让我们说 ffplay
每帧的大小是 720x240
像素,而实际上是 720x480
像素。这将导致 ffplay
读取原始比特流错误并在错误的位置创建帧边界。
ffplay -f rawvideo -pixel_format yuv420p -video_size 720x240 -i output.yuv
以下是当您使用 ffplay
错误的文件大小参数播放 YUV 文件时的输出结果。
现在我们知道如何将视频转换为 YUV 格式 ffmpeg
并使用 ffplay
.
作为最后一步,让我们学习如何计算 YUV 文件的大小。这将帮助我们在尝试转换过程之前估计所需的存储空间。
计算 YUV420p 文件的大小
文件的有趣之 yuv420p
处在于其大小可以使用一些直接的视频参数轻松计算。
所以,这就是你需要的——
- 文件的分辨率(以像素为单位的高度和宽度),
- 帧数,以及
- 每个像素的位数。
收集完这些详细信息后,您需要做的就是,
- 计算单个YUV420帧的像素数
- 将其乘以
bpp
(每像素位数)值以获得 1 帧的大小(以位为单位) - 将该数字乘以完整视频中的帧数以获得视频的大小(以位为单位)
- 将其除以 8 以获得以字节为单位的大小。
如果您不知道如何获取视频的帧数,可以使用 ffprobe
它。这是命令 – 请根据您的用例修改它。
ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 720.avi
下面,我展示了示例 AVI 文件的计算。该视频的参数是:-
- 分辨率 =
720x480
Y 平面的360x240
像素,U 平面和 V 平面的像素。(为什么?因为,我们使用的是yuv420p
像素格式,其中 U 和 V 平面的高度和宽度是 Y 平面的一半。) - 帧数=
1237
(我曾经ffprobe
得到这个数字) - 它使用
8
位来表示视频的每个像素。IE,8 bpp
让我们计算单个 YUV 帧中的像素数 –
The number of pixels in a single frame = (number of pixels in the Y-plane)
+ (number of pixels in the U-plane)
+ (number of pixels in the V-plane)
那给了我们 720*480 + 360*240 + 360*240 = 518400
。其余计算如下所示。
现在,如果我转到我的 Linux 终端并检查 YUV 文件的大小,我会看到以下内容 –
$ ls -l output.yuv
-rw-r--r-- 1 krishna staff 648000000 Jul 2 11:31 output.yuv
操作系统报告的文件大小 648000000
与我们的计算完全匹配。很好!
看看验证原始 YUV 视频的文件大小是多么简单?
结论
在本文中,您了解到
- 如何将任何视频格式转换成 YUV 原始视频格式,
- 使用 ffplay 播放 YUV 文件,
- 并手动计算 YUV 文件的大小。
希望这有所帮助。在以后的文章中,让我们更多地了解 YUV420p 像素格式,以及这些格式最初存在的原因。
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。