【问题标题】:Sample accurate audio slicing in ffmpeg?在 ffmpeg 中采样准确的音频切片?
【发布时间】:2017-06-27 22:06:35
【问题描述】:

我需要将 .wav 格式的音频文件切成 10 秒的块。 这些块需要正好是 10 秒,而不是 10.04799988232 秒。

我当前使用的代码是

ffmpeg -i test.wav -ss 0 -to 10 -c:a libfdk_aac -b:a 80k aac/test.aac

ffmpeg version 3.2.2 Copyright (c) 2000-2016 the FFmpeg developers
  built with Apple LLVM version 8.0.0 (clang-800.0.42.1)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/3.2.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-opencl --disable-lzma --enable-nonfree --enable-vda
  libavutil      55. 34.100 / 55. 34.100
  libavcodec     57. 64.101 / 57. 64.101
  libavformat    57. 56.100 / 57. 56.100
  libavdevice    57.  1.100 / 57.  1.100
  libavfilter     6. 65.100 /  6. 65.100
  libavresample   3.  1.  0 /  3.  1.  0
  libswscale      4.  2.100 /  4.  2.100
  libswresample   2.  3.100 /  2.  3.100
  libpostproc    54.  1.100 / 54.  1.100
Guessed Channel Layout for Input Stream #0.0 : stereo
Input #0, wav, from '/Users/chris/Repos/mithc/client/assets/audio/wav/test.wav':
  Duration: 00:04:37.62, bitrate: 2307 kb/s
    Stream #0:0: Audio: pcm_s24le ([1][0][0][0] / 0x0001), 48000 Hz, stereo, s32 (24 bit), 2304 kb/s
Output #0, adts, to '/Users/chris/Repos/mithc/client/assets/audio/aac/test.aac':
  Metadata:
    encoder         : Lavf57.56.100
    Stream #0:0: Audio: aac (libfdk_aac), 48000 Hz, stereo, s16, 80 kb/s
    Metadata:
      encoder         : Lavc57.64.101 libfdk_aac
Stream mapping:
  Stream #0:0 -> #0:0 (pcm_s24le (native) -> aac (libfdk_aac))
Press [q] to stop, [?] for help
size=     148kB time=00:00:15.01 bitrate=  80.6kbits/s speed=40.9x    
video:0kB audio:148kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%

这段代码没有产生精确的切片,有什么想法可以实现吗?

【问题讨论】:

  • 命令:ffmpeg -i test.wav -ss 0 -to 10 -c:a libfdk_aac -b:a 80k aac/test.aac 输出:pastebin.com/nYeh2Xar 还应该提到我正在分割一系列文件以使用网络音频 API 连续播放,因此不丢弃样本对于避免爆裂声。

标签: audio ffmpeg


【解决方案1】:

不可能*。 AAC 音频存储在解码为 1024 个样本的帧中。因此,对于 48000 Hz 的馈送,每帧的持续时间为 0.02133 秒。

如果您将音频存储在 M4A 等指示每个数据包持续时间的容器中,则会调整最后一帧的持续时间以满足指定的t/ss-to。但最后一帧仍然包含完整的 1024 个样本。请参阅下面的读数,在 M4A 中指定为 10 秒的无声流的最后 3 帧。比较数据包大小和持续时间。

stream #0:
  keyframe=1
  duration=0.021
  dts=9.941  pts=9.941
  size=213
stream #0:
  keyframe=1
  duration=0.021
  dts=9.963  pts=9.963
  size=213
stream #0:
  keyframe=1
  duration=0.016
  dts=9.984  pts=9.984
  size=214

如果此流最初存储在 .aac 中,则总持续时间不会是 10.00 秒。现在,M4A 是否适合您将取决于您的播放器。

*有一个 AAC 的变体可以解码为 960 个样本。因此,可以将 48 kHz 的音频编码为正好 10 秒长的流。 FFmpeg 不支持这样的 AAC 编码器。 AFAIK,包括 iTunes 在内的许多应用程序都无法正确播放此类文件。如果你想按照这个规范进行编码,https://github.com/Opendigitalradio/ODR-AudioEnc 上提供了一个编码器

【讨论】:

  • 你是如何从采样率得到帧持续时间的?如果我将 1 秒除以 48000,我不会得到 0.2133。
  • 样本被分组到帧中,每个AAC帧有1024个样本。
  • 啊哈,所以 1/帧率*1024。然后我确实得到了 0,0213(3),正如你所说。谢谢。
猜你喜欢
  • 2019-02-06
  • 1970-01-01
  • 2021-01-07
  • 2023-02-08
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
相关资源
最近更新 更多