FFmpeg concat demuxer 剪切非常不准确,即使对于原始音频也是如此

FFmpeg concat demuxer 剪切非常不准确,即使对于原始音频也是如此

我正在努力解决 ffmpeg concat 解复用器的问题。

假设我有两个文件:ones.wavzeros.wav。它们都是 5 秒长,ones.wav所有样本都是 1,zeros.wav所有样本都是 0。两个文件的采样率都是 44100Hz

现在我想取的前 0.5 秒ones.wav并将其与的前 0.001 秒连接起来zeros.wav。我使用以下concat.txt文件:

file ones.wav
outpoint 0.5

file zeros.wav
outpoint 0.001

并执行以下命令:

ffmpeg -f concat -i concat.txt out.wav

然后输出文件包含 ±0.51084s 或 22528 个 1 样本,以及 ±0.02320s 或 1023 个 0 样本

我如何将这些剪辑精确到所需的长度?如果我使用压缩音频或想要连接视频剪辑,这个答案会如何改变

如果有任何用处,这是命令输出:

ffmpeg version n4.1.2 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 8.2.1 (GCC) 20181127
  configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-nvdec --enable-nvenc --enable-omx --enable-shared --enable-version3
  libavutil      56. 22.100 / 56. 22.100
  libavcodec     58. 35.100 / 58. 35.100
  libavformat    58. 20.100 / 58. 20.100
  libavdevice    58.  5.100 / 58.  5.100
  libavfilter     7. 40.101 /  7. 40.101
  libswscale      5.  3.100 /  5.  3.100
  libswresample   3.  3.100 /  3.  3.100
  libpostproc    55.  3.100 / 55.  3.100
Guessed Channel Layout for Input Stream #0.0 : stereo
Input #0, concat, from 'concat.txt':
  Duration: N/A, start: 0.000000, bitrate: 1411 kb/s
    Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (pcm_s16le (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
Output #0, wav, to 'out.wav':
  Metadata:
    ISFT            : Lavf58.20.100
    Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
    Metadata:
      encoder         : Lavc58.35.100 pcm_s16le
size=      92kB time=00:00:00.52 bitrate=1441.6kbits/s speed=74.3x    
video:0kB audio:92kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.082796%

答案1

压缩音频被分块为帧,例如 AAC 通常被分块为每帧 1024 个样本。尽管未压缩的音频不是这样存储的。ffmpeg 仍将封装样本,因为该框架设计为使用帧。

您需要重新定义框架大小,以便修剪能够更准确地进行。

尝试,

ffmpeg -f concat -segment_time_metadata 1 -i concat.txt -af asetnsamples=44,aselect=concatdec_select out.wav

相关内容