我有两个音频文件,每个文件大约 3 分钟长。我想截取每个文件的前 10 秒,并在特定时间点(0 秒和 10 秒)将它们分别添加到视频文件中。因此生成的视频应该为 20 秒长。
我已经到了这一步:
ffmpeg -i video.mov -ss 0 -t 20 -itsoffset 0 -i audio1.mp3 -itsoffset 10 -i audio2.mp3 -acodec copy -vcodec copy out.mov
...但生成的视频只有第一个音频文件的 20 秒,第二个音频文件没有像它应该的那样从 10 秒开始。
任何帮助都将不胜感激,谢谢!
根据此处的要求,控制台输出如下:
configuration: --cc=/opt/local/bin/clang-mp-3.3 --prefix=/Users/tessus/data/ext/ffmpeg/sw --as=yasm --extra-version=tessus --disable-shared --enable-static --disable-ffplay --enable-gpl --enable-pthreads --enable-postproc --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libx265 --enable-libxvid --enable-libspeex --enable-bzlib --enable-zlib --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libxavs --enable-version3 --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvpx --enable-libgsm --enable-libopus --enable-libmodplug --enable-fontconfig --enable-libfreetype --enable-libass --enable-libbluray --enable-filters --disable-indev=qtkit --enable-runtime-cpudetect
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.102 / 2. 5.102
libswresample 0. 18.100 / 0. 18.100
libpostproc 52. 3.100 / 52. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/arran/Documents/video.mov':
Metadata:
major_brand : qt
minor_version : 537199360
compatible_brands: qt
creation_time : 2014-06-03 02:27:17
Duration: 00:00:10.00, start: 0.000000, bitrate: 981 kb/s
Stream #0:0(eng): Video: mpeg4 (Advanced Simple Profile) (mp4v / 0x7634706D), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 975 kb/s, 1 fps, 1 tbr, 100 tbn, 1k tbc (default)
Metadata:
creation_time : 2014-06-03 02:27:17
handler_name : Apple Alias Data Handler
Input #1, mp3, from '/Users/arran/Documents/audio1.mp3':
Metadata:
title : Audio1
track : 1
Duration: 00:02:51.68, start: 0.025057, bitrate: 256 kb/s
Stream #1:0: Audio: mp3, 44100 Hz, stereo, s16p, 256 kb/s
[mp3 @ 0x102032c00] Estimating duration from bitrate, this may be inaccurate
Input #2, mp3, from '/Users/arran/Documents/audio2.mp3':
Metadata:
track : 1
title : Audio2
Duration: 00:04:32.46, start: 0.000000, bitrate: 320 kb/s
Stream #2:0: Audio: mp3, 44100 Hz, stereo, s16p, 320 kb/s
Output #0, mov, to '/Users/arran/Documents/out.mov':
Metadata:
major_brand : qt
minor_version : 537199360
compatible_brands: qt
encoder : Lavf55.33.100
Stream #0:0(eng): Video: mpeg4 (mp4v / 0x7634706D), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 975 kb/s, 1 fps, 12800 tbn, 100 tbc (default)
Metadata:
creation_time : 2014-06-03 02:27:17
handler_name : Apple Alias Data Handler
Stream #0:1: Audio: mp3 (.mp3 / 0x33706D2E), 44100 Hz, stereo, 256 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #1:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 10 fps=0.0 q=-1.0 Lsize= 1821kB time=00:00:20.03 bitrate= 744.5kbits/s
video:1190kB audio:626kB subtitle:0 data:0 global headers:0kB muxing overhead 0.245487%
答案1
这类似于:ffmpeg
在视频中添加新音频(混合 2 个音频),但我猜它有足够的不同,不会完全重复。
atrim
过滤方法
您可以使用atrim
音频过滤器选择所需的细分,asetpts
筛选将时间戳重置为 0,并且concat
筛选将它们连接或结合在一起:
ffmpeg -i video.mov -i audio1.mp3 -i audio2.mp3 -filter_complex \
"[1:a]atrim=end=10,asetpts=PTS-STARTPTS[a1]; \
[2:a]atrim=end=10,asetpts=PTS-STARTPTS[a2]; \
[a1][a2]concat=n=2:v=0:a=1[a] \"
-map 0:v -map "[a]" -codec:v copy -codec:a libmp3lame -shortest output.mov
这种方法的一个优点是它是一个单一的命令,如果需要,可以将额外的过滤器应用于过滤器图。缺点是它需要重新编码音频,但视频可以流已复制(重新混合)。
多命令法
使用concat
解复用器:
$ ffmpeg -i audio1.mp3 -i audio2.mp3 -map 0:a -t 10 -c copy temp1.mp3 \
-map 1:a -t 10 -c copy temp2.mp3
$ echo "file 'temp1.mp3'" >> input.txt
$ echo "file 'temp2.mp3'" >> input.txt
$ ffmpeg -i video.mov -f concat -i input.txt -map 0:v -map 1:a -c copy \
-shortest output.mov
四个命令,但没有重新编码,因此质量将得以保留。