我试图使用FFMPEG转码一个非常大的帧(4096 x 4096)的视频。这是一个短视频——不到两分钟,但源视频文件有15.8GB。(该视频是一个动画,设计用于投影到天文馆圆顶上。)
源文件是Quicktime MOV,包含未压缩的Photo-JPEG图像(也有音频)。当我告诉FFMPEG将我的MOV文件转码为MP4文件时,它只是说:
打开编码器输出流#0:0时出错-可能是不正确的参数,如bit_rate, rate, width或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
PS:是的,对于那些在家玩的人来说,这是2001 -太空漫游的主题。你可以在YouTube上看到一个1K的版本:2001 - a Fulldome太空漫游。是的,在一个拥有良好音响系统的天文馆里,它绝对是史诗级的。
我认为您实际上遇到了x264编解码器复杂性级别的限制。
来自http://en.wikipedia.org/wiki/H.264/MPEG-4_AVC的关卡简介
正如标准中使用的术语,"级别"是一组指定的约束,指示概要文件所需的解码器性能的程度。例如,配置文件中的支持级别指定了解码器可以使用的最大图像分辨率、帧速率和比特率。符合给定级别的解码器必须能够解码为该级别和所有更低级别编码的所有比特流。
最高级别(5.2)的最大分辨率为4,096×2,304。
我会考虑使用HEVC,这是专门为这些较大格式的4K/超高清分辨率设计的。
http://en.wikipedia.org/wiki/HEVCHEVC的最大分辨率目前为8,192x4,320
我怀疑你的问题已经在这里暗示了:
x264 [error]: malloc of size 17305600 failed
这是ffmpeg
的32位构建吗?如果是这样,恐怕你运气不好。4k视频处理确实需要> 4gb的内存。最好切换到64位版本再试一次。
当然,你的电脑也需要有足够的可用内存。它可能远远超过4 GB,这取决于你的x264设置。