Как извлечь аудио из видео с помощью ffmpeg?

228

Я попробовал следующую команду, чтобы извлечь аудио из видео:

ffmpeg -i Sample.avi -vn -ar 44100 -ac 2 -ab 192k -f mp3 Sample.mp3

но я получаю следующий вывод

libavutil     50.15. 1 / 50.15. 1
libavcodec    52.72. 2 / 52.72. 2
libavformat   52.64. 2 / 52.64. 2
libavdevice   52. 2. 0 / 52. 2. 0
libavfilter    1.19. 0 /  1.19. 0
libswscale     0.11. 0 /  0.11. 0
libpostproc   51. 2. 0 / 51. 2. 0
SamplE.avi: Invalid data found when processing input

Кто-нибудь может помочь, пожалуйста?

user1269669
источник

Ответы:

407

Чтобы извлечь аудиопоток без перекодирования:

ffmpeg -i input-video.avi -vn -acodec copy output-audio.aac
  • -vn нет видео
  • -acodec copy говорит использовать тот же аудио поток, который уже есть.

Прочитайте вывод, чтобы увидеть, что это за кодек, чтобы установить правильное расширение имени файла.

Пол Ирландский
источник
54
и вместо запуска ffmpeg в первый раз, просто чтобы проверить, какой это аудиопоток, используйте ffprobe input-video.avi
FlorianB
15
Если вы извлекаете аудио только из видеопотока, длина аудио может быть меньше, чем длина видео. Чтобы этого не произошло, извлеките аудио и видео с помощью одного и того же вызова ffmpeg, например, "ffmpeg -i vid.avi -map 0: audio.wav -map 0: v onlyvideo.avi
BlenderBender,
2
Было бы здорово расширить этот ответ с помощью команды, которая также инкапсулирует необработанный AAC в контейнер M4A.
Двойной Гра
8
В этом конкретном случае просто замените «.aac» на «.m4a» в пути назначения. ffmpeg достаточно умен, чтобы угадать ваши намерения, и он инкапсулирует результат в контейнер M4A :)
Gras Double
1
Кстати, я создал скрипт PHP, так что я просто указываю входной видеофайл, и он автоматически определяет расширение выходного аудиофайла: superuser.com/questions/1301901/…
Gras Double
117

Для кодирования высококачественного MP3 из AVI лучше всего использовать -q: a для переменной битовой скорости:

ffmpeg -i sample.avi -q:a 0 -map a sample.mp3

Если вы хотите извлечь часть аудио из видео, используйте опцию -ss, чтобы указать начальную метку времени, и опцию -t, чтобы указать длительность кодирования, например, от 3 минут до 5 секунд в течение 45 секунд:

ffmpeg -i sample.avi -ss 00:03:05 -t 00:00:45.0 -q:a 0 -map a sample.mp3
  • Метки времени должны быть в формате ЧЧ: ММ: СС.ххх или в секундах.

  • Если вы не укажете опцию -t, она пойдет до конца.

Рабочий пример:

  1. Скачать ffmpeg
  2. Откройте командную строку (Пуск> Выполнить> CMD) или на Linux / Mac откройте терминал
  3. перейдите в каталог с ffmeg.exe
  4. Введите вашу команду и дождитесь выходного файла (или устраните все ошибки)

введите описание изображения здесь

Джереми Томпсон
источник
3
Вот руководство для -q:aзначений: trac.ffmpeg.org/wiki/Encode/MP3 Ноль - это настройка VBR самого высокого качества, которая обычно приводит к средним битрейтам в верхней части диапазона нормального CBR (где 320 кбит / с - это максимум, возможно, немного выше точки, в которой сжатие без потерь становится более подходящим).
Евгений Сергеев
3
А что делает -map a?
Юлиан Онофрей
Предостережение: это перекодирование аудио со сжатием с потерями, что немного ухудшит качество. Если оригинал уже сжат, вы ухудшите качество в два раза, что может быть или не быть заметным.
Davidmh
Эта команда работает для меня, когда вышеупомянутая с -vnне работает.
Ммм
12

Командная строка верна и работает с действительным видеофайлом. Я хотел бы убедиться, что вы установили правильную библиотеку для работы с mp3, установите lame o probe с другим аудиокодеком.

Обычно

ffmpeg -formats

или

ffmpeg -codecs

даст достаточно информации, чтобы вы знали больше.

Álvaro
источник
11

ffmpeg -i sample.aviпредоставит вам информацию о формате аудио / видео для вашего файла. Убедитесь, что у вас есть правильные библиотеки, сконфигурированные для анализа входных потоков. Также убедитесь, что файл не поврежден.

SMP
источник
Теперь я получил правильный результат, когда попробовал тот же комментарий с .mkv vedio.Почему он не работает для .avi, есть ли какая-нибудь команда ffmpeg для конвертации .avi
user1269669
1
AVI или MKV относится к формату контейнера, который может содержать множество различных аудио / видео форматов. Вы не хотите конвертировать аудио AVI, вы хотите конвертировать звуковую дорожку в файле AVI, который вы еще не указали. Используйте команду, которую я перечислил выше, чтобы увидеть, какая звуковая дорожка находится в файле AVI. Если это MP3, вам нужно скомпилировать FFMPEG с библиотекой MP3, такой как LAME lame.sourceforge.net
smp
6

Для кодирования mp3 аудио ffmpeg.org показывает следующий пример:

ffmpeg -i input.wav -codec:a libmp3lame -qscale:a 2 output.mp3

Я извлек аудио из видео, просто заменив input.wavимя файла видео. 2Средства 190 кб / сек. Вы можете увидеть другие уровни качества по моей ссылке выше.

Suragch
источник
Этот пример предназначен для преобразования аудиофайла в другой формат, а не для извлечения его из видео.
Юлиан Онофрей
@IulianOnofrei, как я описал в своем ответе, вы можете заменить аудиофайл на видеофайл. Это сработало для меня.
Сурагча
6

Вот что я только что использовал:

ffmpeg -i my.mkv -map 0:3 -vn -b:a 320k my.mp3

Варианты объяснения:

  • my.mkv - исходный видеофайл, вы можете использовать и другие форматы
  • -map 0:3означает, что я хочу 3-й поток из видео файла. Поместите туда N - видеофайлы часто имеют несколько аудиопотоков; Вы можете опустить его или использовать, -map 0:aчтобы взять аудио поток по умолчанию. Запустите, ffprobe my.mkvчтобы увидеть, какие потоки есть в видеофайле.
  • my.mp3 - целевое имя файла аудио, и ffmpeg выясняет, что я хочу MP3 от его расширения. В моем случае исходный аудиопоток - AC3 DTS, и просто копирование было не тем, что я хотел
  • 320k - желаемый целевой битрейт
  • -vn означает, что я не хочу видео в целевом файле
Артем Васильев
источник
2

Просто предположение:

-ab 192

должно быть

-ab 192k

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

хаотичный
источник
2
Действительный комментарий, и я отредактировал вопрос ОП, чтобы изменить его, но это ничего не меняет (самое большее, это выдает предупреждение).
Жан-Филипп Пелле
2

Если для начала аудио, записанное в avi, не имеет формата mp3, вам может потребоваться указать его -acodec mp3в качестве дополнительного параметра. Или каким бы ни был ваш кодек mp3 (вероятно, в системах Linux -acodec libmp3lame). Вы также можете получить тот же эффект, независимый от платформы, указав вместо этого -f mp3«форсировать» формат в формате mp3, хотя не все версии ffmpeg все еще поддерживают этот переключатель. Ваш пробег может меняться.

Xheralt
источник
2

Для извлечения без преобразования я использую пункт контекстного меню - как пользовательское действие файлового менеджера в Linux - для запуска следующего (после проверки, какой тип аудио содержит видео; пример для видео, содержащего oggаудио):

bash -c 'ffmpeg -i "$0" -map 0:a -c:a copy "${0%%.*}".ogg' %f 

который основан на команде ffmpeg ffmpeg -i INPUT -map 0:a -c:a copy OUTPUT.

Я использовал -map 0:1это без проблем, но, как сказано в комментарии @LordNeckbeard, «поток 0:1не всегда будет аудио. Использование -map 0:aвместо этого -map 0:1позволит избежать двусмысленности».


источник
1
Поток 0:1не гарантированно всегда будет аудио. Использование -map 0:aвместо -map 0:1позволит избежать двусмысленности.
Llogan
@LordNeckbeard ~ Я приму это во внимание, спасибо.
Я использовал, mediainfoчтобы определить звуковую дорожку, и выбрал ее следующим образом: -map 0:a:1где: 1 - индекс второй звуковой дорожки, спасибо! -c:a copyсделал это намного быстрее!
Водолей Power
1

Для людей, которые ищут более простой способ извлечения аудио из видеофайла при сохранении параметров исходного видеофайла, вы можете использовать:

ffmpeg -i <video_file_name.extension> <audio_file_name.extension>

Например, работает:

ffmpeg -i screencap.mov screencap.mp3

извлекает mp3аудиофайл из movвидеофайла.

Юлиан Онофрей
источник
Просто и работает. Почему все остальные решения такие сложные? +1
Скотт Биггс
1
Вопрос в том, почему это имеет право на удаление ?!
Юлиан Онофрей
-1

Используйте -b:aвместо , -abкак -abустарел сейчас, и убедитесь , что ваш путь входного файла является правильным.

Для извлечения аудио из видео я использовал команду ниже, и она работает нормально.

String[] complexCommand = {"-y", "-i", inputFileAbsolutePath, "-vn", "-ar", "44100", "-ac", "2", "-b:a", "256k", "-f", "mp3", outputFileAbsolutePath};

Вот,

  • -y - Перезаписать выходные файлы без запроса.
  • -i- FFmpeg читает из произвольного числа входных «файлов», указанных -iопцией
  • -vn - отключить запись видео
  • -ar - устанавливает частоту дискретизации для аудиопотоков, если они закодированы
  • -ac - Установите количество аудиоканалов.
  • -b:a - установить битрейт аудио
  • -f - формат

Проверьте это для моего полного примера проекта Android FFmpeg на GitHub.

Android-разработчик
источник