我有一堆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-TS
到MPEG-PS
。
如果我在mp4文件上运行该命令,则会产生与预期完全相同的文件。有人知道出了什么问题。现在让我难以置信的是两天,我真的不知道。或者有人对如何每10秒提取一次屏幕截图提出了一个很好的建议,而不会创建太多的屏幕截图并占用所有内存和处理器能力。
答案 0 :(得分:1)
我无法回答你关于ffmpeg奇怪行为的后续问题,即为什么你会得到不一致的结果。我也读过有关修复视频文件的相同技巧。有时它有助于切换到不同的视频容器(mkv和mp4通常效果最好)。由于您的问题相当陈旧,我建议您使用最新版本并提交错误报告,如果您仍然观察到相同的结果(在提交错误报告时始终每晚使用最新版本):https://ffmpeg.org/bugreports.html
但是,我建议您使用VLC转换视频作为替代方法。打开VLC,选择Media-> Save / Convert ..(Ctrl + R),添加文件,转换/保存[按钮],转换 - 配置文件(默认H.264 + MP3,或任何你喜欢的),设置目标路径,和开始 即使文件损坏严重,ffmpeg甚至没有开始转换,这对我也有用。