编辑

编辑

有几个输入源,我想将音频放在输出中的特定位置

目前复杂的滤波器表达式是剪切原始音频并将其放置在相同的位置

我想将它放在指定位置之间..


编辑

以下是带有输出的完整命令:

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]    

延迟以毫秒为单位。

相关内容