如何使用FFMPEG在特定时间将音频添加到现有视频中?

10

我有一个包含10分钟视频的视频文件(.avi)。 我还有一个包含1分钟声音的音频文件(.wav)。

我需要将音频添加到现有视频中,但音频需要从视频的一分钟后开始。

如何操作?

(如果可能的话)建议使用ffmpeg。

已经尝试了此查询(30秒延迟)。

-i video.avi -i audio.wav -filter_complex \"[1]adelay=30000|30000[aud];[0][aud]amix\" - c:v copy out.avi"

附上尝试合并多个wav文件时使用ffmpeg的日志:

ffmpeg started on 2018-01-10 at 11:14:57
Report written to "ffmpeg-20180110-111457.log"
Command line:
ffmpeg.exe -report -i "..\\merged.avi" -i "Storage\\1.wav" -i "Storage\\2.wav" -i "Storage\\3.wav" -filter_complex "adelay=30000|30000" "adelay=91000|91000" "adelay=151000|151000" -c:v copy "Storage\\ALL.AVI"
ffmpeg version 3.4.1 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 7.2.0 (GCC)
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-cuda --enable-cuvid --enable-d3d11va --enable-nvenc --enable-dxva2 --enable-avisynth --enable-libmfx
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
Splitting the commandline.
Reading option '-report' ... matched as option 'report' (generate a report) with argument '1'.
Reading option '-i' ... matched as input url with argument '..\mergedVideoOnly.avi'.
Reading option '-i' ... matched as input url with argument '\Storage\0030_0130.wav'.
Reading option '-i' ... matched as input url with argument '\Storage\0130_0230.wav'.
Reading option '-i' ... matched as input url with argument '\Storage\0230_0330.wav'.
Reading option '-filter_complex' ... matched as option 'filter_complex' (create a complex filtergraph) with argument 'adelay=30000|30000'.
Reading option 'adelay=91000|91000' ... matched as output url.
Reading option 'adelay=151000|151000' ... matched as output url.
Reading option '-c:v' ... matched as option 'c' (codec name) with argument 'copy'.
Reading option 'ALL.AVI' ... matched as output url.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option report (generate a report) with argument 1.
Applying option filter_complex (create a complex filtergraph) with argument adelay=30000|30000.
Successfully parsed a group of options.
Parsing a group of options: input url ..\mergedVideoOnly.avi.
Successfully parsed a group of options.
Opening an input file: ..\mergedVideoOnly.avi.
[NULL @ 042ed360] Opening '..\mergedVideoOnly.avi' for reading
[file @ 042ee300] Setting default whitelist 'file,crypto'
[avi @ 042ed360] Format avi probed with size=2048 and score=100
[avi @ 042ee500] use odml:1
[avi @ 042ed360] Before avformat_find_stream_info() pos: 5690 bytes read:100744 seeks:4 nb_streams:1
[avi @ 042ed360] parser not found for codec scpr, packets or times may be invalid.
[avi @ 042ed360] parser not found for codec scpr, packets or times may be invalid.
[avi @ 042ed360] max_analyze_duration 5000000 reached at 5000000 microseconds st:0
[avi @ 042ed360] rfps: 2.916667 0.012539
[avi @ 042ed360] rfps: 2.916667 0.012539
[avi @ 042ed360] rfps: 3.000000 0.000000
[avi @ 042ed360] rfps: 3.083333 0.012539
[avi @ 042ed360] rfps: 3.083333 0.012539
[avi @ 042ed360] rfps: 5.916667 0.012539
[avi @ 042ed360] rfps: 5.916667 0.012539
[avi @ 042ed360] rfps: 6.000000 0.000000
[avi @ 042ed360] rfps: 6.000000 0.000000
[avi @ 042ed360] rfps: 6.083333 0.012539
[avi @ 042ed360] rfps: 6.083333 0.012539
[avi @ 042ed360] rfps: 8.916667 0.012539
[avi @ 042ed360] rfps: 8.916667 0.012539
[avi @ 042ed360] rfps: 9.000000 0.000000
[avi @ 042ed360] rfps: 9.083333 0.012539
[avi @ 042ed360] rfps: 9.083333 0.012539
[avi @ 042ed360] rfps: 11.916667 0.012539
[avi @ 042ed360] rfps: 11.916667 0.012539
[avi @ 042ed360] rfps: 12.000000 0.000000
[avi @ 042ed360] rfps: 12.000000 0.000000
[avi @ 042ed360] rfps: 12.083333 0.012539
[avi @ 042ed360] rfps: 12.083333 0.012539
[avi @ 042ed360] rfps: 14.916667 0.012539
[avi @ 042ed360] rfps: 14.916667 0.012539
[avi @ 042ed360] rfps: 15.000000 0.000000
[avi @ 042ed360] rfps: 15.083333 0.012539
[avi @ 042ed360] rfps: 15.083333 0.012539
[avi @ 042ed360] rfps: 17.916667 0.012539
[avi @ 042ed360] rfps: 17.916667 0.012539
[avi @ 042ed360] rfps: 18.000000 0.000000
[avi @ 042ed360] rfps: 18.000000 -0.000000
[avi @ 042ed360] rfps: 18.083333 0.012539
[avi @ 042ed360] rfps: 18.083333 0.012539
[avi @ 042ed360] rfps: 20.916667 0.012539
[avi @ 042ed360] rfps: 20.916667 0.012539
[avi @ 042ed360] rfps: 21.000000 0.000000
[avi @ 042ed360] rfps: 21.083333 0.012539
[avi @ 042ed360] rfps: 21.083333 0.012539
[avi @ 042ed360] rfps: 23.916667 0.012539
[avi @ 042ed360] rfps: 23.916667 0.012539
[avi @ 042ed360] rfps: 24.000000 0.000000
[avi @ 042ed360] rfps: 24.000000 -0.000000
[avi @ 042ed360] rfps: 24.083333 0.012539
[avi @ 042ed360] rfps: 24.083333 0.012539
[avi @ 042ed360] rfps: 26.916667 0.012539
[avi @ 042ed360] rfps: 26.916667 0.012539
[avi @ 042ed360] rfps: 27.000000 0.000000
[avi @ 042ed360] rfps: 27.083333 0.012539
[avi @ 042ed360] rfps: 27.083333 0.012539
[avi @ 042ed360] rfps: 29.916667 0.012539
[avi @ 042ed360] rfps: 29.916667 0.012539
[avi @ 042ed360] rfps: 30.000000 0.000000
[avi @ 042ed360] rfps: 30.000000 -0.000000
[avi @ 042ed360] rfps: 33.000000 0.000000
[avi @ 042ed360] rfps: 36.000000 0.000000
[avi @ 042ed360] rfps: 36.000000 -0.000000
[avi @ 042ed360] rfps: 39.000000 0.000000
[avi @ 042ed360] rfps: 42.000000 0.000000
[avi @ 042ed360] rfps: 42.000000 0.000000
[avi @ 042ed360] rfps: 45.000000 0.000000
[avi @ 042ed360] rfps: 48.000000 0.000000
[avi @ 042ed360] rfps: 48.000000 0.000000
[avi @ 042ed360] rfps: 51.000000 0.000000
[avi @ 042ed360] rfps: 54.000000 0.000000
[avi @ 042ed360] rfps: 54.000000 -0.000000
[avi @ 042ed360] rfps: 57.000000 0.000000
[avi @ 042ed360] rfps: 60.000000 0.000000
[avi @ 042ed360] rfps: 60.000000 0.000000
[avi @ 042ed360] rfps: 120.000000 0.000000
[avi @ 042ed360] rfps: 120.000000 -0.000000
[avi @ 042ed360] rfps: 240.000000 0.000000
[avi @ 042ed360] rfps: 240.000000 -0.000000
[avi @ 042ed360] rfps: 23.976024 0.001038
[avi @ 042ed360] rfps: 23.976024 0.001038
[avi @ 042ed360] rfps: 29.970030 0.001622
[avi @ 042ed360] rfps: 29.970030 0.001622
[avi @ 042ed360] rfps: 59.940060 0.006487
[avi @ 042ed360] rfps: 59.940060 0.006487
[avi @ 042ed360] rfps: 11.988012 0.000259
[avi @ 042ed360] rfps: 11.988012 0.000259
[avi @ 042ed360] rfps: 14.985015 0.000405
[avi @ 042ed360] rfps: 14.985015 0.000405
[avi @ 042ed360] rfps: 47.952048 0.004152
[avi @ 042ed360] rfps: 47.952048 0.004152
[avi @ 042ed360] After avformat_find_stream_info() pos: 105829 bytes read:175139 seeks:4 frames:15
Input #0, avi, from '..\mergedVideoOnly.avi':
  Metadata:
    encoder         : Lavf57.83.100
  Duration: 00:00:25.33, start: 0.000000, bitrate: 113 kb/s
    Stream #0:0, 15, 1/3: Video: scpr (SCPR / 0x52504353), rgb0, 1920x1200, 112 kb/s, 3 fps, 3 tbr, 3 tbn, 3 tbc
Successfully opened the file.
Parsing a group of options: input url " "\Storage\0030_0130.wav.
Successfully parsed a group of options.
Opening an input file: " "\Storage\1.wav.
[NULL @ 03be0180] Opening '" "\Storage\1.wav' for reading
[file @ 03be0820] Setting default whitelist 'file,crypto'
[wav @ 03be0180] Format wav probed with size=2048 and score=99
[wav @ 03be0180] Before avformat_find_stream_info() pos: 44 bytes read:65580 seeks:1 nb_streams:1
[wav @ 03be0180] probing stream 0 pp:32
[wav @ 03be0180] probing stream 0 pp:31
[wav @ 03be0180] probing stream 0 pp:30
[wav @ 03be0180] probing stream 0 pp:29
[wav @ 03be0180] probing stream 0 pp:28
[wav @ 03be0180] probing stream 0 pp:27
[wav @ 03be0180] probing stream 0 pp:26
[wav @ 03be0180] probing stream 0 pp:25
[wav @ 03be0180] probing stream 0 pp:24
[wav @ 03be0180] probing stream 0 pp:23
[wav @ 03be0180] probing stream 0 pp:22
[wav @ 03be0180] probing stream 0 pp:21
[wav @ 03be0180] probing stream 0 pp:20
[wav @ 03be0180] probing stream 0 pp:19
[wav @ 03be0180] probing stream 0 pp:18
[wav @ 03be0180] probing stream 0 pp:17
[wav @ 03be0180] probing stream 0 pp:16
[wav @ 03be0180] probing stream 0 pp:15
[wav @ 03be0180] probing stream 0 pp:14
[wav @ 03be0180] probing stream 0 pp:13
[wav @ 03be0180] probing stream 0 pp:12
[wav @ 03be0180] probing stream 0 pp:11
[wav @ 03be0180] probing stream 0 pp:10
[wav @ 03be0180] probing stream 0 pp:9
[wav @ 03be0180] probing stream 0 pp:8
[wav @ 03be0180] probing stream 0 pp:7
[wav @ 03be0180] probing stream 0 pp:6
[wav @ 03be0180] probing stream 0 pp:5
[wav @ 03be0180] probing stream 0 pp:4
[wav @ 03be0180] probing stream 0 pp:3
[wav @ 03be0180] probing stream 0 pp:2
[wav @ 03be0180] probing stream 0 pp:1
[wav @ 03be0180] probed stream 0
[wav @ 03be0180] parser not found for codec pcm_s16le, packets or times may be invalid.
[wav @ 03be0180] max_analyze_duration 5000000 reached at 5120000 microseconds st:0
[wav @ 03be0180] After avformat_find_stream_info() pos: 131116 bytes read:196652 seeks:1 frames:22
Guessed Channel Layout for Input Stream #1.0 : mono
Input #1, wav, from '" "\Storage\0030_0130.wav':
  Duration: 00:00:56.80, bitrate: 128 kb/s
    Stream #1:0, 22, 1/8000: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 8000 Hz, mono, s16, 128 kb/s
Successfully opened the file.
Parsing a group of options: input url " "\Storage\2.wav.
Successfully parsed a group of options.
Opening an input file: " "\Storage\2.wav.
[NULL @ 03bed760] Opening '" "\Storage\2.wav' for reading
[file @ 03bb3100] Setting default whitelist 'file,crypto'
[wav @ 03bed760] Format wav probed with size=2048 and score=99
[wav @ 03bed760] Before avformat_find_stream_info() pos: 44 bytes read:65580 seeks:1 nb_streams:1
[wav @ 03bed760] probing stream 0 pp:32
[wav @ 03bed760] probing stream 0 pp:31
[wav @ 03bed760] probing stream 0 pp:30
[wav @ 03bed760] probing stream 0 pp:29
[wav @ 03bed760] probing stream 0 pp:28
[wav @ 03bed760] probing stream 0 pp:27
[wav @ 03bed760] probing stream 0 pp:26
[wav @ 03bed760] probing stream 0 pp:25
[wav @ 03bed760] probing stream 0 pp:24
[wav @ 03bed760] probing stream 0 pp:23
[wav @ 03bed760] probing stream 0 pp:22
[wav @ 03bed760] probing stream 0 pp:21
[wav @ 03bed760] probing stream 0 pp:20
[wav @ 03bed760] probing stream 0 pp:19
[wav @ 03bed760] probing stream 0 pp:18
[wav @ 03bed760] probing stream 0 pp:17
[wav @ 03bed760] probing stream 0 pp:16
[wav @ 03bed760] probing stream 0 pp:15
[wav @ 03bed760] probing stream 0 pp:14
[wav @ 03bed760] probing stream 0 pp:13
[wav @ 03bed760] probing stream 0 pp:12
[wav @ 03bed760] probing stream 0 pp:11
[wav @ 03bed760] probing stream 0 pp:10
[wav @ 03bed760] probing stream 0 pp:9
[wav @ 03bed760] probing stream 0 pp:8
[wav @ 03bed760] probing stream 0 pp:7
[wav @ 03bed760] probing stream 0 pp:6
[wav @ 03bed760] probing stream 0 pp:5
[wav @ 03bed760] probing stream 0 pp:4
[wav @ 03bed760] probing stream 0 pp:3
[wav @ 03bed760] probing stream 0 pp:2
[wav @ 03bed760] probing stream 0 pp:1
[wav @ 03bed760] probed stream 0
[wav @ 03bed760] parser not found for codec pcm_s16le, packets or times may be invalid.
[wav @ 03bed760] max_analyze_duration 5000000 reached at 5120000 microseconds st:0
[wav @ 03bed760] After avformat_find_stream_info() pos: 131116 bytes read:196652 seeks:1 frames:22
Guessed Channel Layout for Input Stream #2.0 : mono
Input #2, wav, from '" "\Storage\0130_0230.wav':
  Duration: 00:00:59.81, bitrate: 128 kb/s
    Stream #2:0, 22, 1/8000: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 8000 Hz, mono, s16, 128 kb/s
Successfully opened the file.
Parsing a group of options: input url " "\Storage\3.wav.
Successfully parsed a group of options.
Opening an input file: " "\Storage\3.wav.
[NULL @ 03bfeea0] Opening '" "\Storage\3.wav' for reading
[file @ 03bfe8e0] Setting default whitelist 'file,crypto'
[wav @ 03bfeea0] Format wav probed with size=2048 and score=99
[wav @ 03bfeea0] Before avformat_find_stream_info() pos: 44 bytes read:65580 seeks:1 nb_streams:1
[wav @ 03bfeea0] probing stream 0 pp:32
[wav @ 03bfeea0] probing stream 0 pp:31
[wav @ 03bfeea0] probing stream 0 pp:30
[wav @ 03bfeea0] probing stream 0 pp:29
[wav @ 03bfeea0] probing stream 0 pp:28
[wav @ 03bfeea0] probing stream 0 pp:27
[wav @ 03bfeea0] probing stream 0 pp:26
[wav @ 03bfeea0] probing stream 0 pp:25
[wav @ 03bfeea0] probing stream 0 pp:24
[wav @ 03bfeea0] probing stream 0 pp:23
[wav @ 03bfeea0] probing stream 0 pp:22
[wav @ 03bfeea0] probing stream 0 pp:21
[wav @ 03bfeea0] probing stream 0 pp:20
[wav @ 03bfeea0] probing stream 0 pp:19
[wav @ 03bfeea0] probing stream 0 pp:18
[wav @ 03bfeea0] probing stream 0 pp:17
[wav @ 03bfeea0] probing stream 0 pp:16
[wav @ 03bfeea0] probing stream 0 pp:15
[wav @ 03bfeea0] probing stream 0 pp:14
[wav @ 03bfeea0] probing stream 0 pp:13
[wav @ 03bfeea0] probing stream 0 pp:12
[wav @ 03bfeea0] probing stream 0 pp:11
[wav @ 03bfeea0] probing stream 0 pp:10
[wav @ 03bfeea0] probing stream 0 pp:9
[wav @ 03bfeea0] probing stream 0 pp:8
[wav @ 03bfeea0] probing stream 0 pp:7
[wav @ 03bfeea0] probing stream 0 pp:6
[wav @ 03bfeea0] probing stream 0 pp:5
[wav @ 03bfeea0] probing stream 0 pp:4
[wav @ 03bfeea0] probing stream 0 pp:3
[wav @ 03bfeea0] probing stream 0 pp:2
[wav @ 03bfeea0] probing stream 0 pp:1
[wav @ 03bfeea0] probed stream 0
[wav @ 03bfeea0] parser not found for codec pcm_s16le, packets or times may be invalid.
[wav @ 03bfeea0] max_analyze_duration 5000000 reached at 5120000 microseconds st:0
[wav @ 03bfeea0] After avformat_find_stream_info() pos: 131116 bytes read:196652 seeks:1 frames:22
Guessed Channel Layout for Input Stream #3.0 : mono
Input #3, wav, from '" "\Storage\0230_0330.wav':
  Duration: 00:00:59.81, bitrate: 128 kb/s
    Stream #3:0, 22, 1/8000: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 8000 Hz, mono, s16, 128 kb/s
Successfully opened the file.
detected 4 logical cores
[Parsed_adelay_0 @ 03c0c460] Setting 'delays' to value '30000|30000'
Parsing a group of options: output url adelay=91000|91000.
Successfully parsed a group of options.
Opening an output file: adelay=91000|91000.
[NULL @ 03c17640] Unable to find a suitable output format for 'adelay=91000|91000'
adelay=91000|91000: Invalid argument
[AVIOContext @ 042ee400] Statistics: 175139 bytes read, 4 seeks
[AVIOContext @ 03be0900] Statistics: 196652 bytes read, 1 seeks
[AVIOContext @ 03bca7e0] Statistics: 196652 bytes read, 1 seeks
[AVIOContext @ 03bfe9a0] Statistics: 196652 bytes read, 1 seeks

我找到了如何在视频开头添加音频的方法(简单地串联即可),但我需要将音频向前移动1分钟。 - Yanshof
3个回答

14

使用

ffmpeg -i in.avi -i audio.wav -filter_complex
"[1]adelay=62000|62000[aud];[0][aud]amix" -c:v copy out.avi

adelay 延迟 WAV 文件的开始时间 62000 毫秒,适用于所有频道,假设 WAV 中有 2 个频道,并将其混合到视频的音频中。


要混合两个音频文件,

ffmpeg -i in.avi -i audio1.wav -i audio2.wav -filter_complex
"[1]adelay=30000|30000[aud1];[2]adelay=90000|90000[aud2];
 [0][aud1][aud2]amix=3" -c:v copy out.avi

我添加了嵌入式日志。 - Yanshof
这是针对另一个命令的,该命令恰好格式不正确:ffmpeg.exe -report -i "video.avi" -i "555.wav" -filter_complex "adelay=20000" - c:v copy "OUT.avi" - Gyan
1
因为您只提供了一个adelay值。它应该是20000|20000 - Gyan
能否在不复制到新文件的情况下完成?我的意思是在原始视频文件上完成。 - Yanshof
1
ffmpeg.exe -i "..\\merged.avi" -i "Storage\\1.wav" -i "Storage\\2.wav" -i "Storage\\3.wav" -filter_complex "[1]adelay=30000|30000[a1];[2]adelay=91000|91000[a2];[3]adelay=151000|151000[a3];[0][a1][a2][a3]amix=4" -c:v copy "Storage\\ALL.AVI" - Gyan
显示剩余7条评论

2
这是如何做到的,让我们看看他们是否更改了代码,并且不投资于支付员工来建造所有这些的公司。
ffmpeg -y -i video.mp4 -i 002.ogg.mp3 -i 003.ogg.mp3 -i 004.ogg.mp3 -filter_complex "[1]adelay=1000[s1];[2]adelay=2500[s2];[3]adelay=4000[s3];[s1][s2][s3]amix=3[a]" -map 0:v -map "[a]" -preset ultrafast video_with_audio.mp4

很容易理解,filter_complex按顺序接受命令作为参数,并分配变量名称,后续可以在系列中使用,最后一个命令混合所有内容。


https://gist.github.com/andrewhodel/a2854df02a5ab06967b5223f5b0a44b6 - Andrew Hodel

0
我非常确定你在测试/应用所有的搜索时都没有将'a'添加到'v'中。
将音频添加到视频中并不像1-2-3那么简单。请仔细阅读。 (a=音频,v=视频,ta=临时音频文件,v.position=视频文件在毫秒级别的位置)
如果你无法理解以下内容,可以简单地放弃你项目中的方法,关于“将a添加到v”。这样做不会有���大的区别。
/////////////////// 大局观 ///////////////////
  1. 检查'v'是否有任何'a'。(超出话题)
  2. 如果'v'有'a',从'v'中提取'a',并将'a'保存为'ta'。(超出话题)
  3. 如果'v'没有任何'a',收集所有插入的'a'。(超出话题)
  4. 在'v'中找到以秒为单位的插入位置来插入'a'(动态插入位置直到应用)。如果'a'的持续时间超过插入位置处'v'的持续时间,则修剪'a'。(超出话题)
  5. 确保在应用到'v'之前“混合所有音频”。(超出话题)
如果'a'没有被正确修剪,'v'的持续时间结束后仍会播放。 (离题)。
///////////// 现在回到主题。 ///////////////
以下在v.position 0秒处添加[a1.aac],并在v.position 1秒处添加[a2.m4a]。 [adelay=]必须按照[adelay=milSec.|milSec.]的格式进行设置。 [amix=2] => 混合2个音频。如果要混合3个音频,请将#替换为3,即[amix=#]。其中一个输入的'a'可以是从'v'中提取的'ta' = [临时音频文件]。
ffmpeg -i v.mp4 -i a1.aac -i a2.m4a -filter_complex "[1]adelay=0|0[a1];[2]adelay=1000|1000[a2];[a1][a2]amix=2[a]" -map 0:v -map "[a]" -y output.mp4
如果要将'a'添加到没有任何'a'的'v'中,请使用-filter_complex "[1]adelay=v.position|v.position[a1]" -map 0:v -map "[a1]" -y output.mp4。
请不要问我任何“离题”的问题。
谢谢,

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接