我正在尝试使用 ffmpeg 将 quicktime 拆分为更小的 quicktime。我有一个 csv 文件,其中包含输入和输出点,我将它提供给 Python,然后 Python 会构建一个 ffmpeg 命令。但是,我注意到某些生成的文件没有显示视频,因此我从命令行单独运行了该命令。
>ffmpeg -i in.mov -ss 27.042 -to 29.208 -c:v copy -c:a copy test.mov
ffmpeg version N-66673-gf0d1b3a Copyright (c) 2000-2014 the FFmpeg developers
built on Oct 6 2014 22:10:42 with gcc 4.9.1 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-lib
modplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinge
r --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis
--enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-zlib
libavutil 54. 9.100 / 54. 9.100
libavcodec 56. 3.101 / 56. 3.101
libavformat 56. 7.104 / 56. 7.104
libavdevice 56. 1.100 / 56. 1.100
libavfilter 5. 1.102 / 5. 1.102
libswscale 3. 1.100 / 3. 1.100
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 1.100 / 53. 1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'in.mov':
Metadata:
major_brand : qt
minor_version : 512
compatible_brands: qt
encoder : Lavf56.7.104
Duration: 00:20:54.46, start: 0.000000, bitrate: 1734 kb/s
Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, 1617 kb/s, 24 fps, 24 tbr, 12288 tbn, 24576 tbc (default)
Metadata:
handler_name : DataHandler
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 113 kb/s (default)
Metadata:
handler_name : DataHandler
File 'test.mov' already exists. Overwrite ? [y/N] y
Output #0, mov, to 'test.mov':
Metadata:
major_brand : qt
minor_version : 512
compatible_brands: qt
encoder : Lavf56.7.104
Stream #0:0(eng): Video: h264 (avc1 / 0x31637661), yuv420p, 1280x720, q=2-31, 1617 kb/s, 24 fps, 12288 tbn, 12288 tbc (default)
Metadata:
handler_name : DataHandler
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, 113 kb/s (default)
Metadata:
handler_name : DataHandler
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 0 fps=0.0 q=-1.0 Lsize= 31kB time=00:00:02.18 bitrate= 115.3kbits/s
video:0kB audio:30kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 4.003038%
quicktime 源自 Adobe Premiere,我确实必须从电影文件中删除大量元数据,以便脚本运行得更快。保留元数据并没有什么不同。我还有另一个(相关的?)问题,音频输出正确,但前几秒视频丢失。
任何帮助都将受到赞赏。
答案1
复制比特流时,无法对视频/音频流进行帧精确(或毫秒精确)分割(-c:v copy -c:a copy
)。由于输出视频必须以关键帧开始(如果不是,它将无法正常播放),因此它ffmpeg
会一直搜索,直到在视频比特流中找到关键帧,并且然后开始输出视频。
在您的特定情况下,您可以看到没有写入任何帧(frame=0
),因为原始视频的起点和终点之间显然没有关键帧。(显然,写入了一些音频,但音频比特流基本上可以在任何时间点访问。)
如果您想要精确剪切,唯一的选择就是重新编码视频,从而生成新的关键帧。
ffmpeg -i in.mov -ss 27.042 -to 29.208 -c:v libx264 -c:a aac -strict experimental test.mov
您需要在此处调整质量设置。请参阅x264和加气混凝土指南。另请阅读使用 FFmpeg 进行搜索知道的位置-ss
意味着什么。基本上,为了在重新编码时准确切割,-ss
总是需要去后 -i
。
如果你不关心精确的切割时间,segment
复用器可以提供帮助。在这里,您不一定需要重新编码。但请注意:
...如果您想要对视频文件进行精确分割,您需要使输入关键帧与分割器预期的精确分割时间相对应,否则片段复用器将使用在指定的开始时间之后找到的下一个关键帧来开始新的片段。