使用 FFmpeg 转换为 YUV 并使用 ffplay 播放

了解如何使用 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。让我们说 ffplay 每帧的大小是 720x240 像素,而实际上是 720x480 像素。这将导致 ffplay 读取原始比特流错误并在错误的位置创建帧边界。

ffplay -f rawvideo -pixel_format yuv420p -video_size 720x240 -i output.yuv

以下是当您使用 ffplay 错误的文件大小参数播放 YUV 文件时的输出结果。

ffplay 尺寸错误

现在我们知道如何将视频转换为 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。其余计算如下所示。

yuv文件大小计算

现在,如果我转到我的 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 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论