在ffmpeg中采样准确的音频切片?

时间:2017-02-09 18:40:40

标签: audio ffmpeg

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

我正在使用的当前代码是

error:
    * Type family equations violate injectivity annotation:
        NAry 1 t o = t -> o
        NAry n t o = t -> NAry (n - 1) t o
error:
    * Type family equation violates injectivity annotation.
      Type variable `n' cannot be inferred from the right-hand side.
      In the type family equation:
        NAry n t o = t -> NAry (n - 1) t o

此代码不会产生精确的切片,任何想法如何实现?

1 个答案:

答案 0 :(得分:3)

不可能*。 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

处使用编码器