使用ffmpeg修复mpeg文件

使用ffmpeg修复mpeg文件,ffmpeg,Ffmpeg,我有一堆MPEG文件,不知何故无效或不正确。我可以在不同的媒体播放器中播放这些文件,但当我上传这些文件时,它们应该会自动转换。创建屏幕截图需要很长时间,它创建了大约10000个屏幕截图,而不是预期的50个。该命令是自动转换应用程序的一部分。对于mp4和其他文件,它工作得很好,但对于MPEG,它并不像预期的那样工作。创建屏幕截图会消耗掉所有内存和处理器电源 为了创建屏幕截图,我尝试了以下方法: ffmpeg -y -i /input/file.mpeg -f image2 -aspect 16:9

我有一堆MPEG文件,不知何故无效或不正确。我可以在不同的媒体播放器中播放这些文件,但当我上传这些文件时,它们应该会自动转换。创建屏幕截图需要很长时间,它创建了大约10000个屏幕截图,而不是预期的50个。该命令是自动转换应用程序的一部分。对于mp4和其他文件,它工作得很好,但对于MPEG,它并不像预期的那样工作。创建屏幕截图会消耗掉所有内存和处理器电源

为了创建屏幕截图,我尝试了以下方法:

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 -y -i input.mpeg -codec:v copy -codec:a copy output.mpeg
给我提供了有关缓冲区的错误:

    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/file.mpeg -f image2 -vf fps=fps=1/10 -aspect 16:9 -vsync passthrough -bt 20M /output/file-%05d.jpg
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-TS
MPEG-PS


如果我在mp4文件上运行该命令,它将生成与预期完全相同的文件。有人知道出了什么问题吗。这让我有两天都很困惑,我真的没有任何线索。或者有人对如何每10秒提取一次屏幕截图有什么好的建议,而不会创建太多的屏幕截图并消耗所有内存和处理器电源。

我无法回答您随后提出的关于ffmpeg奇怪行为的问题,即为什么会得到不一致的结果。我也读过同样的修复视频文件的技巧。有时切换到不同的视频容器会有所帮助(mkv&mp4通常效果最好)。由于您的问题比较老,如果您仍然观察到相同的结果,我建议您使用最新版本并提交错误报告(在提交错误报告时始终使用最新版本):

但是,我可以推荐使用VLC转换视频作为替代方法。打开VLC,选择Media->Save/Convert..(Ctrl+R),添加您的文件,Convert/Save[按钮],Convert-Profile(默认的H.264+MP3或任何您喜欢的格式),设置目标路径,然后开始。

即使是ffmpeg甚至没有开始转换的严重损坏的文件,这对我来说也是有效的。

为什么,根据我的经验,我为根本问题提供了另一种方法,可以产生更好的结果。好的,那么请更详细地描述。或者您可以查看一些代码,这很好。请再加上这个。