我一直在使用超过 450GB(cca 400 个文件)的 ffmpeg 1.0.7 来创建缩略图和获取视频文件信息。我花了大约 1-2 秒从 ~8GB 文件创建 10 个缩略图。但是现在我有一些“损坏”的视频文件(672 MB),它在一分钟内为我创建了 1 个缩略图,在 10 分钟内创建了 10 个缩略图 -> 我的服务器烧毁了:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9769 www-data 20 0 395m 28m 7212 R 157.0 0.4 0:04.99 ffmpeg
我在 Windows Media Player 中打开文件并出现空白屏幕,而 -> 视频文件很奇怪,在 VLC 中打开它并写信给我:Because this AVI file index is broken or missing, seeking will not work correctly. VLC won't repair your file but can temporary fix this problem by building an index in memory.
我点击了“按原样播放”,它可以正确播放视频文件,但是我的网络服务器烧毁因为 FFmpeg 和 PHP 等待exec();
命令的返回。10 分钟后也可以正常创建缩略图,但是如何解决此问题或防止执行 FFmpeg 以在这些损坏的“视频”文件上创建缩略图?
这是我的 php:
$cmd = "ffmpeg -i error.avi 2>&1";
$info = `$cmd`;
echo '<pre>';
print_r($info);
echo '</pre>';
这是我得到的输出(很快)
ffmpeg version 1.0.7 Copyright (c) 2000-2013 the FFmpeg developers
built on Jul 19 2013 07:14:44 with gcc 4.7 (Debian 4.7.2-5)
configuration: --prefix=/usr --extra-cflags='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security ' --extra-ldflags='-Wl,-z,relro' --cc='ccache cc' --enable-shared --enable-libmp3lame --enable-gpl --enable-nonfree --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-x11grab --enable-libgsm --enable-libtheora --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libspeex --enable-nonfree --disable-stripping --enable-libvpx --enable-libschroedinger --disable-encoder=libschroedinger --enable-version3 --enable-libopenjpeg --enable-librtmp --enable-avfilter --enable-libfreetype --enable-libvo-aacenc --disable-decoder=amrnb --enable-libvo-amrwbenc --enable-libaacplus --libdir=/usr/lib/x86_64-linux-gnu --disable-vda --enable-libbluray --enable-libcdio --enable-gnutls --enable-frei0r --enable-openssl --enable-libass --enable-libopus --enable-fontconfig --enable-libfdk-aac --enable-libdc1394 --disable-altivec --dis libavutil 51. 73.101 / 51. 73.101
libavcodec 54. 59.100 / 54. 59.100
libavformat 54. 29.104 / 54. 29.104
libavdevice 54. 2.101 / 54. 2.101
libavfilter 3. 17.100 / 3. 17.100
libswscale 2. 1.101 / 2. 1.101
libswresample 0. 15.100 / 0. 15.100
libpostproc 52. 0.100 / 52. 0.100
Input #0, avi, from 'error.avi':
Metadata:
encoder : VirtualDubMod 1.5.10.2 (build 2540/release)
Duration: 01:29:39.32, start: 0.000000, bitrate: 1048 kb/s
Stream #0:0: Video: mpeg4 (Advanced Simple Profile) (XVID / 0x44495658), yuv420p, 640x272 [SAR 1:1 DAR 40:17], 23.98 tbr, 23.98 tbn, 23.98 tbc
Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 48000 Hz, stereo, s16, 128 kb/s
At least one output file must be specified
所以看起来只是创建缩略图有问题:
exec("ffmpeg -ss 01:11:43 -i error.avi -vframes 1 -s 616x320 -an output_1.jpg 2>&1");
问题可能出在哪里?感谢您的建议!
顺便提一句。我将其发布在 SO 上是因为我不确定它是否属于这里——我认为它可以通过 PHP 以某种方式完成,但我不太确定。
编辑:我添加了超时,它“修复”了我的问题,但即使是最新版本的 FFmpeg 2. 也无法从损坏的视频文件中创建缩略图。
exec("timeout 5s ffmpeg -ss 01:11:43 -i error.avi -vframes 1 -s 616x320 -an output_1.jpg 2>&1");