有几个输入源,我想将音频放在输出中的特定位置
目前复杂的滤波器表达式是剪切原始音频并将其放置在相同的位置
我想将它放在指定位置之间..
编辑
以下是带有输出的完整命令:
ffmpeg version N-60489-g03911c4 Copyright (c) 2000-2014 the FFmpeg developers
built on Feb 10 2014 05:14:06 with gcc 4.6 (Debian 4.6.3-1)
configuration: --prefix=/root/ffmpeg-static/32bit --arch=x86_32 --extra-cflags='-m32 -I/root/ffmpeg-static/32bit/include -static' --extra-ldflags='-m32 -L/root/ffmpeg-static/32bit/lib -static' --extra-libs='-lxml2 -lexpat -lfreetype' --enable-static --disable-shared --disable-ffserver --disable-doc --enable-bzlib --enable-zlib --enable-postproc --enable-runtime-cpudetect --enable-libx264 --enable-gpl --enable-libtheora --enable-libvorbis --enable-libmp3lame --enable-gray --enable-libass --enable-libfreetype --enable-libopenjpeg --enable-libspeex --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-version3 --enable-libvpx
libavutil 52. 63.101 / 52. 63.101
libavcodec 55. 50.100 / 55. 50.100
libavformat 55. 31.100 / 55. 31.100
libavdevice 55. 8.100 / 55. 8.100
libavfilter 4. 1.102 / 4. 1.102
libswscale 2. 5.101 / 2. 5.101
libswresample 0. 17.104 / 0. 17.104
libpostproc 52. 3.100 / 52. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/a.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2014-02-12 09:37:39
Duration: 00:00:30.98, start: 0.000000, bitrate: 524 kb/s
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 640x360 [SAR 1:1 DAR 16:9], 426 kb/s, 25 fps, 25 tbr, 25 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 95 kb/s (default)
Metadata:
creation_time : 2014-02-12 09:37:39
handler_name : IsoMedia File Produced by Google, 5-11-2011
Guessed Channel Layout for Input Stream #1.0 : stereo
Input #1, wav, from '/tmp/1.wav':
Duration: 00:00:08.79, bitrate: 1536 kb/s
Stream #1:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, stereo, s16, 1536 kb/s
Guessed Channel Layout for Input Stream #2.0 : stereo
Input #2, wav, from '/tmp/2.wav':
Duration: 00:00:12.46, bitrate: 1536 kb/s
Stream #2:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, stereo, s16, 1536 kb/s
Output #0, mp4, to '/tmp/out.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
encoder : Lavf55.31.100
Stream #0:0(und): Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 640x360 [SAR 1:1 DAR 16:9], q=2-31, 426 kb/s, 25 fps, 12800 tbn, 25 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1: Audio: aac (libvo_aacenc) ([64][0][0][0] / 0x0040), 44100 Hz, stereo, s16, 128 kb/s (default)
Stream mapping:
Stream #0:1 (aac) -> atrim
Stream #0:1 (aac) -> atrim
Stream #1:0 (pcm_s16le) -> atrim
Stream #2:0 (pcm_s16le) -> atrim
Stream #0:0 -> #0:0 (copy)
concat -> Stream #0:1 (libvo_aacenc)
Press [q] to stop, [?] for help
[output stream 0:1 @ 0xa8cee60] 100 buffers queued in output stream 0:1, something may be wrong.
frame= 774 fps=572 q=-1.0 Lsize= 2404kB time=00:00:49.21 bitrate= 400.1kbits/s
video:1611kB audio:770kB subtitle:0 data:0 global headers:0kB muxing overhead 0.996036%
我正在尝试将音频音乐放入原始视频中。
问题
30 秒的视频被拍成了 46 秒(而且音频放置不正确)……尽管音频只放置在视频范围内。我听到左边的声音,然后右边的声音也一样?这会增加视频的长度吗?
答案1
假设您想在视频文件的不同位置放置音轨。您使用的音轨将在不同位置被剪切和修剪。在下面的示例中,一个音频来自视频文件本身,另一个来自纯音频文件 - wav 文件。视频文件为videoandaudio.mov
,音频为audio_only.wav
。
过滤atrim
器“切割”音频通道。adelay
过滤器将音频放置在各个点。amix
过滤器将这些音频混合成单个混合输出。aformat
过滤器确保一致性。特别是对于 flv,您需要的采样率不超过 44100Hz。
在示例中,视频文件的音频最多使用 20 秒。第二个音频实际上从 10000 毫秒开始,早于音频的结束时间(20 秒),但此示例特意显示amix
可以处理这种情况。之后,第二个音频开始播放,直到我们在 240 秒处修剪结尾。flv1 编码器再次仅用于说明 - 您可以使用任何东西。确保为视频使用合适的比特率和其他参数。对于音频,如果您使用 filtergraph,则无法执行此操作,-acodec copy
因此我使用 PCM 进行显示。
ffmpeg -i videoandaudio.mov -i audio_only.wav -filter_complex
"[0:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=mono,
atrim=end=20[aud1];
[1:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=mono,
atrim=end=240[bud2];
[bud2]adelay=10000[aud2];
[aud1][aud2]amix=inputs=2"
-map 0:v -c:v flv1 -pix_fmt yuv420p -c:a pcm_s16le out.flv
答案2
您需要adelay
在链中使用过滤器。请参阅这文档。
要延迟一个 pad 的输出,如果[aud1]
使用它作为链末端的延迟滤波器的输入:
[1:a]atrim=end=4,asetpts=PTS-STARTPTS[aud1];[aud1]adelay=2000[delayedaudio]
延迟以毫秒为单位。