Fluent-ffmpeg, как уменьшить размер выходного файла без потери звука

Есть ли наилучшая практика, чтобы размер перекодированного выходного файла не превышал определенного размера?

Мне нужно, чтобы он не превышал 100 МБ, но каким-то образом я получаю большие выходные файлы. Проблема в том, что мой (тестовый) видеофайл весит 600 КБ, а сгенерированный файл output.wav 4 МБ. Это довольно далеко от того, что я ожидал.

var proc = new ffmpeg({
        source: file,
        nolog: false
    });
    proc.addInputOption('-acodec libopus');

    format = "wav";

    proc.addOptions([
        '-f ' + format,
        '-ab 192000',
        '-ar 16000',
        '-vn'
    ]);

Вот как я передал параметры библиотеке ffmpeg. Какие параметры я должен изменить здесь, чтобы уменьшить размер и сохранить макс. качественный?


person shamaleyte    schedule 03.07.2017    source источник
comment
Почему вы выводите в файл WAV? Это будет использовать необработанный звук PCM, который не сжат, поэтому вы получаете такие большие выходные файлы. Если вы не хотите перекодировать (то есть не терять качество), не могли бы вы просто скопировать аудиопоток как есть и записать его в отдельный файл .opus?   -  person slhck    schedule 03.07.2017
comment
Кроме того, я действительно предлагаю вам сначала попробовать эти команды в командной строке — тогда будет очевидно, что делает ffmpeg, какие кодеки он выбирает, каков фактический битрейт и т. д. Только когда вы уверены, что правильная команда: переведите ее в fluent-ffmpeg. Вы получите лучшую помощь, задавая вопросы о командной строке ffmpeg, чем некоторые библиотеки, реализующие его. (Если, конечно, проблема не в самой библиотеке.)   -  person slhck    schedule 03.07.2017
comment
@slchk, я ограничен определенными расширениями; flac, wav, audio/webm audio/webm;codecs=opus, audio/webm;codecs=vorbis . Я пробовал другие форматы вывода, но результат в любом случае такой же большой, как и файл wav. ffmpeg -acodec libopus -i 2.webm -vn output1x.flac Что еще я должен указать здесь, чтобы получить небольшой файл?   -  person shamaleyte    schedule 03.07.2017


Ответы (1)


Использование WAV в качестве выходного формата заставляет ffmpeg выбирать несжатый звук PCM, где настройки битрейта не действуют. Вы можете прочитать этот пост: Что такое кодек (например, DivX?) и чем он отличается от формата файла (например, MPG)?

Если бы вы использовали командную строку, вам просто нужно было бы скопировать аудиопоток в выходной файл, не касаясь битового потока (-c:a copy):

ffmpeg -i input.webm -vn -c:a copy output.opus

В fluent-ffmpeg, я думаю, это путь:

ffmpeg('input.webm')
  .addInputOption('-acodec libopus')
  .noVideo()
  .audioCodec('copy')
  .output('output.opus')

Вы также можете использовать webm в качестве выходного формата, записав в output.webm.

person slhck    schedule 03.07.2017
comment
@slchk, еще раз спасибо за ответ. Но сгенерированный файл опуса всегда начинается с 4-й или 5-й секунды, когда я его играю. Кажется, что первые секунды потеряны. Есть идеи, почему это происходит? Пожалуйста, проверьте этот новый вопрос, который я создал для этой проблемы. stackoverflow.com/questions/45063388/ - person shamaleyte; 12.07.2017