2017-02-09 4 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 -в 10 -с: а libfdk_aac -b: а 80k ААС/test.aac' Выход: http://pastebin.com/nYeh2Xar Следует также упомянуть, что я нарезаю серию файлов, которые нужно воспроизводить с помощью API веб-аудио, поэтому не снимать сэмплы крайне важно, чтобы избежать появления всплывающих окон. –

ответ

2

Невозможно *. Звук AAC сохраняется в кадрах, которые декодируют до 1024 выборок. Таким образом, для подачи 48000 Гц каждый кадр имеет продолжительность 0.02133 секунд.

Если вы храните аудио в контейнере, таком как M4A, который указывает продолжительность для каждого пакета, продолжительность последнего кадра настраивается так, чтобы соответствовать указанному t/ss-to. Но последний кадр все еще содержит полные 1024 образца. См. Показание ниже последних трех кадров беззвучного потока, указанного как 10 секунд в M4A. Сравните размер (-ы) пакета с длительностью.

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 кГц может быть закодирован в поток ровно 10 секунд. FFmpeg не поддерживает такой кодер AAC. AFAIK, многие приложения, включая itunes, не будут воспроизводить такой файл правильно. Если вы хотите кодировать эту спецификацию, есть кодер, доступный по адресу https://github.com/Opendigitalradio/ODR-AudioEnc

Смежные вопросы