我想从指定的偏移量开始,每分钟从视频中提取一帧。例如,假设偏移量为 00:01 (mm:ss),那么我想提取 00:01、01:01、02:01 等等。
我遇到的问题是 ffmpeg 似乎将我的偏移量向下舍入到最接近的分钟。如果我要求 00:01,我会得到 00:00、01:00、02:00 等等。如果我给它 01:01,我会得到 01:00、02:00、03:00 等等。
附加限制:
- 必须渲染字幕。它们位于同一目录中的 .ass 文件中。
- 每个框架的左上角都应该有一些文字
下面是我如何调用 ffmpeg 来获取偏移量00:01
:
ffmpeg -y -i "HorribleSubs.mkv" -ss 00:00:01 \
-vf "ass=HorribleSubs.ass,fps=1/60,drawtext=fontfile=...: fontcolor=white: fontsize=32: x=10: y=10: text=HorribleSubs" \
"screenshots/%03d-HorribleSubs.png"
以下是输出(当我意识到它不起作用时,我按了 ctrl+c):
ffmpeg version git-2013-06-15-8a79a00 Copyright (c) 2000-2013 the FFmpeg developers
built on Jun 15 2013 16:36:45 with gcc 4.7 (Ubuntu/Linaro 4.7.3-1ubuntu1)
configuration: --prefix=/home/sircmpwn/ffmpeg_build --extra-cflags=-I/home/sircmpwn/ffmpeg_build/include --extra-ldflags=-L/home/sircmpwn/ffmpeg_build/lib --bindir=/home/sircmpwn/bin --extra-libs=-ldl --enable-gpl --enable-libass --enable-libfdk-aac --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-x11grab --enable-libfreetype
libavutil 52. 35.101 / 52. 35.101
libavcodec 55. 16.100 / 55. 16.100
libavformat 55. 8.102 / 55. 8.102
libavdevice 55. 2.100 / 55. 2.100
libavfilter 3. 77.101 / 3. 77.101
libswscale 2. 3.100 / 2. 3.100
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 3.100 / 52. 3.100
Input #0, matroska,webm, from 'HorribleSubs.mkv':
Metadata:
creation_time : 2013-05-26 13:34:41
Duration: 00:23:42.11, start: 0.000000, bitrate: 1900 kb/s
Stream #0:0: Video: h264 (High), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 30.30 fps, 30.30 tbr, 1k tbn, 59.94 tbc (default) (forced)
Stream #0:1: Audio: aac, 44100 Hz, stereo, fltp (default) (forced)
Stream #0:2: Subtitle: ssa (default) (forced)
Codec 0x18000 is not in the full list.
Stream #0:3: Attachment: unknown_codec
Metadata:
filename : OpenSans-Semibold.ttf
mimetype : application/x-truetype-font
[Parsed_ass_0 @ 0x19b2100] Added subtitle file: 'HorribleSubs.ass' (9 styles, 374 events)
Output #0, image2, to 'screenshots/%03d-HorribleSubs.png':
Metadata:
encoder : Lavf55.8.102
Stream #0:0: Video: png, rgb24, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 90k tbn, 0.02 tbc (default) (forced)
Stream mapping:
Stream #0:0 -> #0:0 (h264 -> png)
Press [q] to stop, [?] for help
frame= 7 fps=0.5 q=0.0 Lsize=N/A time=00:07:00.00 bitrate=N/A dup=1 drop=0
video:4306kB audio:0kB subtitle:0 global headers:0kB muxing overhead -100.000499%
Received signal 2: terminating.
答案1
当使用 h.264 视频编码时,FFmpeg 无法真正在任何地方剪切(这是您的情况:)Stream #0:0 -> #0:0 (h264 -> png)
。
要使 FFmpeg 在任何地方都能剪切,您需要重新编码视频。请尝试以下操作:
ffmpeg -y -ss 00:00:01 -i "HorribleSubs.mkv" -c:v mpeg2video -g 1 -vf "ass=HorribleSubs.ass,fps=1/60,drawtext=fontfile=...: fontcolor=white: fontsize=32: x=10: y=10: text=HorribleSubs" "screenshots/%03d-HorribleSubs.png"
答案2
这可能有效:将 -ss 放在 -i 前面,这样 ffmpeg 就会在实际执行所有过滤和编码之前寻找该位置。或者尝试 LordNeckbeard 的解决方案来使用选择过滤器,但我对所有这些选项和变量感到困惑。
您可以前往 ffmpeg-users 邮件列表寻求更多帮助。