2017-02-09 360 views
0

我需要将.wav格式的音频文件切分为10秒的块。 这些块需要精确到10秒,而不是10.04799988232秒。在ffmpeg中准确的音频切片样本?

我使用的是当前的代码

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% 

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

+0

适用于我使用相同的编码器和比特率。 M4A准确地说是10秒:'ffmpeg -i input.m4a -f null -',参考'time ='。显示您的实际命令和完整的控制台输出。 – LordNeckbeard

+0

命令: '的ffmpeg -i test.wav -ss 0 -to 10 -c:一个libfdk_aac -b:一个80K AAC/test.aac' 输出: http://pastebin.com/nYeh2Xar 还应该提到,我正在分割一系列要使用网络音频API串联播放的文件,因此不要丢弃样本对于避免爆音是非常重要的。 –

回答

2

不可能*。 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个样本。所以,一个48kHz的音频可以被编码成长达10秒的流。 FFmpeg不支持这种AAC编码器。 AFAIK,包括iTunes在内的许多应用程序不会正确播放这样的文件。如果你想编码到这个规格,有一个编码器在https://github.com/Opendigitalradio/ODR-AudioEnc