我需要将.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
此代码不会产生精确的切片,任何想法如何实现?
答案 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
处使用编码器