FFMPEG/libx264帧大小的上限是多少?

12

我正在尝试使用FFMPEG转码一段非常大的帧数视频(4096 x 4096)。这是一个短视频-不到两分钟,但源视频文件大小为15.8GB。(该视频是设计用于投影在天文馆的圆顶上的动画。)

源文件是Quicktime MOV格式,包含未压缩的Photo-JPEG图像(也包括音频)。当我告诉FFMPEG将我的MOV文件转码为MP4文件时,它只是说:

Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height

并没有什么太大的帮助,但是我已经检查过所有参数是否正确和/或默认设置。事实上,如果我将请求的输出大小更改为2048x2048,则一切都正常工作。这就是为什么我怀疑编码器存在上限。

我很困惑。任何导致成功转码的建议都将不胜感激。(此时,我也愿意考虑FFMPEG的替代方案。)

相关事实

我从脚本中运行FFMPEG:

set srcFile=%1
set dstFile=%srcFile:.mov=.mp4%

ffmpeg -i %srcFile% -movflags faststart -q:a 0 -q:v 0 -pix_fmt yuv420p -sws_flags gauss -s 4096x4096 %dstFile%

输出结果

    ffmpeg version N-50911-g9efcfbe Copyright (c) 2000-2013 the FFmpeg developers
    built on Mar 13 2013 21:26:48 with gcc 4.7.2 (GCC)
    configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --ena
ble-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 19.100 / 52. 19.100
  libavcodec     55.  0.100 / 55.  0.100
  libavformat    55.  0.100 / 55.  0.100
  libavdevice    54.  4.100 / 54.  4.100
  libavfilter     3. 45.103 /  3. 45.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'also-sprach-zarathustra-4k.mov':
  Metadata:
    major_brand     : qt
    minor_version   : 537199360
    compatible_brands: qt
    creation_time   : 2013-01-11 23:41:30
  Duration: 00:01:40.57, start: 0.000000, bitrate: 1357694 kb/s
    Stream #0:0(eng): Audio: pcm_s16be (twos / 0x736F7774), 44100 Hz, stereo, s16, 1411 kb/s
    Metadata:
      creation_time   : 2013-01-11 23:41:30
      handler_name    : Apple Alias Data Handler
    Stream #0:1(eng): Video: mjpeg (jpeg / 0x6765706A), yuvj420p, 4096x4096 [SAR 1:1 DAR 1:1], 1356281 kb/s, 30 fps, 30
tbr, 3k tbn, 3k tbc
    Metadata:
      creation_time   : 2013-01-11 23:41:30
      handler_name    : Apple Alias Data Handler
File 'also-sprach-zarathustra-4k.mp4' already exists. Overwrite ? [y/N] y
using SAR=1/1
[libx264 @ 003b9c80] frame MB size (256x256) > level limit (36864)
[libx264 @ 003b9c80] DPB size (4 frames, 262144 mbs) > level limit (2 frames, 184320 mbs)
[libx264 @ 003b9c80] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX AVX2 FMA3 LZCNT BMI1 BMI2
x264 [error]: malloc of size 17305600 failed
Output #0, mp4, to 'also-sprach-zarathustra-4k.mp4':
  Metadata:
    major_brand     : qt
    minor_version   : 537199360
    compatible_brands: qt
    Stream #0:0(eng): Video: h264, yuv420p, 4096x4096 [SAR 1:1 DAR 1:1], q=-1--1, 90k tbn, 30 tbc
    Metadata:
      creation_time   : 2013-01-11 23:41:30
      handler_name    : Apple Alias Data Handler
    Stream #0:1(eng): Audio: none, 44100 Hz, stereo, s16, 128 kb/s
    Metadata:
      creation_time   : 2013-01-11 23:41:30
      handler_name    : Apple Alias Data Handler
Stream mapping:
  Stream #0:1 -> #0:0 (mjpeg -> libx264)
  Stream #0:0 -> #0:1 (pcm_s16be -> libvo_aacenc)
Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height

提示:是的,对于那些在家玩游戏的人来说,这是电影《2001太空漫游》的主题曲。你可以在这里看到一个1K的YouTube版本:2001 - A Fulldome Space Odyssey。而且,在一个拥有良好音响系统的天文馆,它绝对是史诗级别的。


1
我知道这个周末我要构建什么。 - Xeoncross
2个回答

11

我认为你实际上遇到了x264编解码器复杂性级别的限制。

http://en.wikipedia.org/wiki/H.264/MPEG-4_AVC简要描述这些级别。

按标准使用的术语,“级别”是指一组指定的约束条件,表示需要支持特定配置文件的解码器性能程度。例如,配置文件中的支持级别指定解码器可以使用的最大图像分辨率、帧率和比特率。符合给定级别的解码器必须能够解码针对该级别及所有更低级别编码的所有比特流。

最高级别(5.2)的最大分辨率为4,096×2,304。

建议尝试使用HEVC,它专为这些更大的4K / Ultra-HD分辨率设计。

http://en.wikipedia.org/wiki/HEVC

目前,HEVC的最大分辨率为8,192x4,320。


谢谢提供的链接。它们回答了我的核心问题,事实上也回答了一个未来的问题:是否有任何(流行/标准)编解码器可以处理8Kx8K?12Kx12K?你可能会笑,但我的视频已经通过8Kx8K 60fps立体投影系统播放。到2020年,我预计这将达到16Kx16K 60fps的峰值,这对于中大型圆顶来说接近视网膜级别。感谢指向HEVC。不幸的是,我不确定它今天是否真正解决了我的问题,因为它还不普及。另一方面,它几乎肯定是未来的趋势。 - Chaotic
1
很好地发现了H.264没有允许4k x 4k视频的级别。但我仍然感到惊讶的是x264在malloc()中失败了,这似乎是一个bug。 - njahnke
2
好消息!我愚蠢地安装了ImageMajick,它在路径中安装了自己的FFMPEG版本。出于一时兴起,我执行了'where ffmpeg'命令,结果让我大吃一惊,原来我正在运行一个更旧(可能是32位)的FFMPEG版本。一切都好!现在我能够将4K MOV文件压缩成4K MP4文件了。感谢大家的建议,特别是@njahnke,让我继续质疑我的理智。 - Chaotic

8
我猜测你的问题可能与以下提示有关:
x264 [error]: malloc of size 17305600 failed

这是一个32位的ffmpeg构建吗?如果是,我担心你可能没有什么好运气。4k视频处理确实需要> 4 GB的内存。最好切换到64位构建并重试。
当然,您的计算机实际上还需要有足够的可用内存。这可能比4GB多得多,具体取决于您的x264设置。

3
不是这个问题。我也注意到了,所以立刻进行了双重检查。我的系统完全支持64位,保证没有问题。(我的系统配置非常强大——最新的四核i7处理器,32GB内存,NVIDIA Titan显卡,极快的固态硬盘等等。) - Chaotic
2
不是你的系统,而是Libav构建需要64位。 - Sergio Basurco
1
感谢您的回答;似乎在Windows上,imagemagick认为它的4年前构建的ffmpeg应该比您安装的任何版本都更早地放在系统路径中。我想我不会再拿回那三分钟的诅咒了。 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接