FFMPEG:转码隔行 J2K

FFMPEG:转码隔行 J2K

我的任务是使用 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),使用和及其参数的各种组合interlacetinterlace单独使用和与的组合scale。但都不起作用。

我是不是想从苹果中榨出橙汁?还是我只是没有使用正确的命令选项?

相关内容