0

我一直在使用超过 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");
4

0 回答 0