2017-02-09 4 views
0

Ich muss eine Audiodatei im WAV-Format in 10-Sekunden-Chunks schneiden. Diese Stücke müssen genau 10 Sekunden lang sein, nicht 10,04799988232 Sekunden.Sample genaue Audio Slicing in ffmpeg?

der aktuelle Code ich verwende ist

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% 

Dieser Code nicht exakt Scheiben produzieren, irgendwelche Ideen, wie kann dies erreicht werden?

+0

verfügbar ist. Arbeiten für mich mit dem gleichen Encoder und Bitrate. M4A ist genau 10 Sekunden lang: 'ffmpeg -i input.m4a -f null -', siehe' time = '. Zeigen Sie Ihren eigentlichen Befehl und die gesamte Konsolenausgabe. – LordNeckbeard

+0

Befehl: 'ffmpeg -i test.wav -ss 0 -bis 10 -c: a libfdk_aac -b: a 80k aac/test.aac' Ausgang: http://pastebin.com/nYeh2Xar Sollte auch erwähnen, dass ich eine Reihe von Dateien aufzuschneiden bin, die mit der Web-Audio-API in Serie abgespielt werden, so dass das Ablegen von Samples nicht kritisch ist, um Pops zu vermeiden. –

Antwort

2

Nicht möglich *. AAC Audio wird in Frames gespeichert, die zu 1024 Samples dekodieren. Für einen 48000 Hz-Vorschub hat jeder Rahmen eine Dauer von 0.02133 Sekunden.

Wenn Sie das Audio in einem Container wie M4A speichern, der die Dauer pro Paket angibt, wird die Dauer des letzten Frames angepasst, um die angegebene t/ss-to zu erfüllen. Aber der letzte Frame enthält immer noch die vollen 1024 Samples. Sehen Sie die Anzeige der letzten 3 Frames eines stillen Streams, der in einem M4A auf 10 Sekunden festgelegt wurde. Vergleichen Sie die Paketgröße (n) mit der Dauer.

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 

Wenn dieser Strom ursprünglich in .aac gespeichert wurden, würde Gesamtdauer nicht 10.00 Sekunden sein. Nun, ob M4A den Trick für Sie macht, hängt von Ihrem Spieler ab.

* Es gibt eine Variante von AAC, die zu 960 Samples dekodiert. So könnte ein 48-kHz-Audio zu einem Strom genau 10 Sekunden lang codiert werden. FFmpeg hat keinen solchen AAC-Encoder. AFAIK, viele Apps einschließlich itunes spielen eine solche Datei nicht korrekt ab. Wenn Sie diese Spezifikation verschlüsseln möchten, gibt es einen Encoder, der unter https://github.com/Opendigitalradio/ODR-AudioEnc

Verwandte Themen