Як можна витягнути аудіо з відео за допомогою ffmpeg?


227

Я намагався виконати наступну команду для отримання звуку з відео:

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

Хто-небудь може допомогти, будь ласка?

Відповіді:


406

Щоб витягнути аудіопотік без повторного кодування:

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 :)
подвійний Грас

1
FWIW, я створив PHP-скрипт, так що я просто вказую вхідний відео-файл, і він автоматично визначає розширення вихідного аудіофайлу: superuser.com/questions/1301901/…
подвійний грас,

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
  • Часові позначки повинні бути у форматі HH: MM: SS.xxx або в секундах.

  • Якщо не вказати опцію -t, вона піде до кінця.

Робочий приклад:

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

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


3
Ось посібник щодо -q:aзначень: trac.ffmpeg.org/wiki/Encode/MP3 Zero - це найвищої якості VBR-налаштування, яке, як правило, призводить до середніх бітрейтів у верхній частині здорового діапазону CBR (де 320 кбіт / с - значення максимум, ймовірно, трохи за межею, коли компресія без втрат стає більш доцільною).
Євгеній Сергієв

3
А що робить -map a?
Юліан Онофрей

Caveat: це повторне кодування звуку з втратою стиснення, що дещо погіршить якість. Якщо оригінал вже стислий, ви погіршите якість вдвічі, що може бути або не помітно.
Давідм

Ця команда працює для мене, коли одна з вищезгаданих команд - -vnні.
Ммм

12

Командний рядок правильний і працює на дійсному відеофайлі. Я би переконався, що ви встановили правильну бібліотеку для роботи з mp3, встановите кульгавий зонд з іншим звуковим кодеком.

Зазвичай

ffmpeg -formats

або

ffmpeg -codecs

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


11

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


Тепер, я отримав правильний результат , коли я спробував один і той же коментар з .mkv vedio.why він не працює для .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ім'я відеофайлу. Засіб 2190 кб / сек. Ви можете побачити інші рівні якості за моїм посиланням вище.


Цей приклад призначений для перетворення аудіофайлу в інший формат, а не для отримання його з відео.
Юліан Онофрей

@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 все ще підтримують цей комутатор. Ваш пробіг може бути різним.


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дозволить уникнути двозначності.
логіан

@LordNeckbeard ~ Я це врахую, дякую.

Я mediainfoвизначав аудіозапис і вибрав його так: -map 0:a:1де a: 1 - другий індекс звукової доріжки, thx! -c:a copyзробили це набагато швидше!
Сила Водолія

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 - формат

Перевірте це для мого повного зразка проекту FFmpeg для Android на GitHub.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.