使用ffmpeg修复mpeg文件

时间:2014-02-27 08:50:37

标签: ffmpeg

我有一堆MPEG文件,它们在某种程度上无效或不正确。我可以在不同的媒体播放器中播放文件,但是当我上传文件时,它们应该自动转换。创建屏幕截图需要很长时间,它会创建大约10000个屏幕截图,而不是预期的50个屏幕截图。该命令是自动转换应用程序的一部分。使用mp4和其他文件,它工作得很好,但是它没有按预期工作。屏幕截图的创建会占用所有内存和处理器能力。

为了创建屏幕截图,我尝试了以下内容:

ffmpeg -y -i /input/file.mpeg -f image2 -aspect 16:9 -bt 20M -vsync passthrough -vf select='isnan(prev_selected_t)+gte(t-prev_selected_t\,10)' /output/file-%05d.jpg

这只会创建2个截图,而我预计会有50个左右。以下命令:

ffmpeg -y -i /input/file.mpeg -f image2 -vf fps=fps=1/10 -aspect 16:9 -vsync passthrough -bt 20M /output/file-%05d.jpg

给了我关于缓冲区的错误:

    ffmpeg version N-39361-g1524b0f Copyright (c) 2000-2014 the FFmpeg developers
      built on Feb 26 2014 23:46:40 with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-4)
      configuration: --prefix=/home/example/ffmpeg_build --extra-cflags=-I/home/example/ffmpeg_build/include --extra-ldflags=-L/home/example/ffmpeg_build/lib --bindir=/home/example/bin --extra-libs=-ldl --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libfreetype --enable-libspeex --enable-libtheora
      libavutil      52. 66.100 / 52. 66.100
      libavcodec     55. 52.102 / 55. 52.102
      libavformat    55. 33.100 / 55. 33.100
      libavdevice    55. 10.100 / 55. 10.100
      libavfilter     4.  2.100 /  4.  2.100
      libswscale      2.  5.101 /  2.  5.101
      libswresample   0. 18.100 /  0. 18.100
      libpostproc    52.  3.100 / 52.  3.100
    [mp3 @ 0x200d7c0] Header missing
    [mpegts @ 0x2008a60] DTS discontinuity in stream 0: packet 6 with DTS 34185, packet 7 with DTS 8589926735
    [mpegts @ 0x2008a60] Invalid timestamps stream=0, pts=7157, dts=8589932741, size=150851
    Input #0, mpegts, from '/home/example/app/uploads/21.mpeg':
      Duration: 00:03:14.75, start: 0.213000, bitrate: 26112 kb/s
      Program 1
Stream #0:0[0x3e9]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv), 1440x1080 [SAR 4:3 DAR 16:9], max. 25000 kb/s, 29.97 fps, 60 tbr, 90k tbn, 59.94 tbc
Stream #0:1[0x3ea]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, s16p, 384 kb/s
    [swscaler @ 0x1ff9860] deprecated pixel format used, make sure you did set range correctly
    Output #0, image2, to '/home/example/app/uploads/21-%05d.jpg':
      Metadata:
encoder         : Lavf55.33.100
Stream #0:0: Video: mjpeg, yuvj420p, 1440x1080 [SAR 4:3 DAR 16:9], q=2-31, 200 kb/s, 90k tbn, 0.10 tbc
    Stream mapping:
      Stream #0:0 -> #0:0 (mpeg2video -> mjpeg)
    Press [q] to stop, [?] for help
    [mpegts @ 0x2008a60] Invalid timestamps stream=0, pts=7157, dts=8589932741, size=150851
    [output stream 0:0 @ 0x1ff2ba0] 100 buffers queued in output stream 0:0, something may be wrong.
    [output stream 0:0 @ 0x1ff2ba0] 1000 buffers queued in output stream 0:0, something may be wrong.

它创造了大约10000个截图,而我期望50。

现在我已经阅读了有关如何修复某些损坏文件的内容。为此,我有以下命令:

ffmpeg -y -i input.mpeg -codec:v copy -codec:a copy output.mpeg

然而,这会创建一个稍小的文件,但如果我再次在输出上运行相同的命令,我希望它创建相同的文件,但是以下命令

ffmpeg -y -i output.mpeg -codec:v copy -codec:a copy output2.mpeg

返回一个小得多的文件,只运行几秒钟,而原始文件约为3分钟。

如果我为未损坏的MPEG运行“修复”命令,那么在我第一次运行命令时会导致文件小得多。使用ffprobe我检查了哪些内容已更改,但唯一更改的内容是MPEG-TSMPEG-PS

如果我在mp4文件上运行该命令,则会产生与预期完全相同的文件。有人知道出了什么问题。现在让我难以置信的是两天,我真的不知道。或者有人对如何每10秒提取一次屏幕截图提出了一个很好的建议,而不会创建太多的屏幕截图并占用所有内存和处理器能力。

1 个答案:

答案 0 :(得分:1)

我无法回答你关于ffmpeg奇怪行为的后续问题,即为什么你会得到不一致的结果。我也读过有关修复视频文件的相同技巧。有时它有助于切换到不同的视频容器(mkv和mp4通常效果最好)。由于您的问题相当陈旧,我建议您使用最新版本并提交错误报告,如果您仍然观察到相同的结果(在提交错误报告时始终每晚使用最新版本):https://ffmpeg.org/bugreports.html

但是,我建议您使用VLC转换视频作为替代方法。打开VLC,选择Media-> Save / Convert ..(Ctrl + R),添加文件,转换/保存[按钮],转换 - 配置文件(默认H.264 + MP3,或任何你喜欢的),设置目标路径,和开始 即使文件损坏严重,ffmpeg甚至没有开始转换,这对我也有用。