我的任务是使用 ffmpeg 开发一个解决方案,将档案视频转码为 FFV1。这些视频都是 JPEG2000,但有些未压缩,有些经过压缩。由于原始源文件是隔行扫描的,我们需要为转码文件保留相同的隔行扫描。
我遇到的问题是,对未压缩的 j2k 进行转码后,ffv1 视频文件的大小与预期相符,但奇怪的是,对其他文件进行转码后,文件大小甚至比 j2k 源文件还要大——实际上几乎是前者的两倍。我确信这是因为视频比特率(和 B/PI 值,如报告的媒体信息)是源文件的两倍大。尽管我尽力了,但我还是无法制作出具有相似比特率和像素存储密度(以及相似大小)的视频,即使我尝试了多种不同的方法,包括使用中间的未压缩文件。
我现在正在考虑以下问题:源文件上使用的压缩格式真的比 ffv1 好很多吗,还是我遗漏了一些真正基本的东西?我倾向于认为是后者,但现在我感觉自己是在盲目地尝试。任何帮助都将不胜感激。
以下是一些补充信息:
- 源文件的 mediainfo 报告:
Format : MXF
Format version : 1.3
File size : 5,81 Gib
Duration : 17 min 45s
Overall bit rate : 46.8 Mb/s
Frame rate : 25.000 Im/s
Video
Format : JPEG 2000
Width : 720 pixels
Height : 576 pixels
Display aspect ratio : 16/9
Frame rate : 25.000 Im/s
Original frame rate : 50.000 Im/s
Standard : PAL
Color space : YUV
Chroma subsampling : 4:2:2
Bit depth : 10 bits
Scan type : Interlaced
Scan order : Top field first
Bits/(Pixel*Frame) : 4.067
(还有 2 个音轨和 3 个时间码轨道,这里未显示。)
- 将前 60 秒直接转码为 ffv1 是行不通的;生成的视频是逐行的,并且其中一个要求是保留隔行扫描。因此使用
tinterlace
,我得到了一个具有以下特征的文件:
General
Format : Matroska
Format version : Version 4
File size : 670 MiB
Duration : 1 min 0 s
Overall bit rate mode : Variable
Overall bit rate : 93.7 Mb/s
Frame rate : 25.000 FPS
Video
Format : FFV1
Format version : Version 3.4
Format settings, GOP : N=1
Width : 720 pixels
Height : 576 pixels
Display aspect ratio : 16:9
Frame rate mode : Constant
Frame rate : 25.000 FPS
Standard : PAL
Color space : YUV
Chroma subsampling : 4:2:2
Bit depth : 10 bits
Scan type : Interlaced
Scan order : Top Field First
Compression mode : Lossless
Bits/(Pixel*Frame) : 8.411
位存储密度是源视频的两倍(8.4 对 4.1),比特率也是如此。这是我的命令行:
ffmpeg -hide_banner -i $input -t 60 \
-c:v ffv1 -level 3 -threads 8 -slices 4 -slicecrc 1 -g 1 \
-pix_fmt yuv422p10le \
-vf tinterlace=0 \
-c:a copy -c:d copy -c:s copy -c:t copy \
-map 0 -y $output
我尝试将源文件转码为完全未压缩的 v210+avi 中间文件,然后将其转码为 ffv1。v210 的前 60 秒为 1.57Gb。将其转码为 ffv1 后得到一个 673Mb 的文件,其比特率和 B/PI 再次是原来的两倍多(分别为 94.1Mbps 和 8.45)。
我尝试提取为 PNG,然后重新整合图像。与
tinterlace
上面的过滤器一样,这会产生一个大约是原始视频两倍的视频。比特率为 90Mbps,B/PI 8.1。-crf
我也尝试了许多其他方法,包括使用、、-b:v
等限制比特率-maxrate
(显然没有考虑到 ffv1),使用和及其参数的各种组合interlace
,tinterlace
单独使用和与的组合scale
。但都不起作用。
我是不是想从苹果中榨出橙汁?还是我只是没有使用正确的命令选项?