Bagaimana cara mengekstrak audio dari video dengan ffmpeg?

227

Saya mencoba perintah berikut untuk mengekstrak audio dari video:

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

tapi saya mendapatkan output berikut

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

Apakah ada yang bisa membantu?

pengguna1269669
sumber

Jawaban:

406

Untuk mengekstrak aliran audio tanpa pengodean ulang:

ffmpeg -i input-video.avi -vn -acodec copy output-audio.aac
  • -vn tidak ada video.
  • -acodec copy mengatakan gunakan aliran audio yang sama yang sudah ada di sana.

Baca output untuk melihat codec apa itu, untuk mengatur ekstensi nama file yang tepat.

Paul Irish
sumber
54
dan alih-alih menjalankan ffmpeg pertama kali hanya untuk memeriksa streaming audio yang mana, gunakan ffprobe input-video.avi
FlorianB
15
Jika Anda hanya mengekstrak audio dari aliran video, panjang audio mungkin lebih pendek dari panjang video. Untuk memastikan ini tidak terjadi, ekstrak kedua audio DAN video dengan panggilan yang sama ke ffmpeg, misalnya "ffmpeg -i vid.avi -map 0: a audio.wav -map 0: v onlyvideo.avi
BlenderBender
2
Akan bagus untuk memperluas jawaban ini dengan perintah yang juga merangkum AAC mentah ke dalam wadah M4A.
Gras Double
8
Dalam kasus yang tepat ini, ganti saja ".aac" dengan ".m4a" di jalur tujuan. ffmpeg cukup pintar untuk menebak maksud Anda, dan merangkum hasilnya ke dalam wadah M4A :)
Gras Double
1
FWIW, saya telah membuat skrip PHP, jadi saya hanya menentukan file video input, dan secara otomatis menentukan ekstensi file audio output: superuser.com/questions/1301901/…
Gras Double
117

Untuk menyandikan MP3 berkualitas tinggi dari AVI, gunakan -q: a untuk laju bit variabel:

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

Jika Anda ingin mengekstrak sebagian audio dari video gunakan opsi -ss untuk menentukan cap waktu mulai, dan opsi -t untuk menentukan durasi pengkodean, misalnya dari 3 menit dan 5 detik selama 45 detik:

ffmpeg -i sample.avi -ss 00:03:05 -t 00:00:45.0 -q:a 0 -map a sample.mp3
  • Stempel waktu harus dalam format HH: MM: SS.xxx atau dalam detik.

  • Jika Anda tidak menentukan opsi -t itu akan pergi ke akhir.

Contoh kerja:

  1. Unduh ffmpeg
  2. Buka Command Prompt (Start> Run> CMD) atau di Linux / Mac buka Terminal
  3. cd ke direktori dengan ffmeg.exe
  4. Keluarkan perintah Anda dan tunggu file keluaran (atau atasi kesalahan apa pun)

masukkan deskripsi gambar di sini

Jeremy Thompson
sumber
3
Berikut adalah panduan untuk -q:anilai: trac.ffmpeg.org/wiki/Encode/MP3 Zero adalah pengaturan VBR berkualitas tinggi, yang biasanya menghasilkan bitrate rata-rata di bagian atas rentang CBR yang waras (di mana 320 kbit / s adalah maksimum, mungkin sedikit di luar titik di mana kompresi lossless menjadi lebih tepat).
Evgeni Sergeev
3
Dan apa fungsinya -map a?
Iulian Onofrei
Peringatan: ini adalah encoding ulang audio dengan kompresi lossy, yang akan menurunkan kualitas sedikit. Jika dokumen asli sudah dikompresi, Anda akan menurunkan kualitas dua kali, yang mungkin atau mungkin tidak terlihat.
Davidmh
Perintah ini bekerja untuk saya, ketika yang di atas -vntidak.
Mmm
12

Baris perintah sudah benar dan berfungsi pada file video yang valid. Saya akan memastikan bahwa Anda telah menginstal perpustakaan yang benar untuk bekerja dengan mp3, instal probe lumpuh dengan codec audio lain.

Biasanya

ffmpeg -formats

atau

ffmpeg -codecs

akan memberikan informasi yang cukup sehingga Anda tahu lebih banyak.

Arolvaro
sumber
11

ffmpeg -i sample.aviakan memberi Anda info format audio / video untuk file Anda. Pastikan Anda memiliki pustaka yang tepat yang dikonfigurasi untuk mengurai aliran input. Pastikan juga file tersebut tidak rusak.

smp
sumber
sekarang, saya mendapat hasil yang benar ketika saya mencoba komentar yang sama dengan .mkv vedio.why tidak bekerja untuk .avi, apakah ada perintah ffmpeg untuk mengkonversi .avi
user1269669
1
AVI atau MKV mengacu pada format wadah yang dapat menampung banyak format audio / video yang berbeda. Anda tidak ingin mengonversi audio AVI, Anda ingin mengonversi trek audio dalam file AVI, yang belum Anda tentukan. Gunakan perintah yang saya sebutkan di atas untuk melihat jenis audio apa yang ada di dalam file AVI. Jika itu MP3, Anda harus mengompilasi FFMPEG dengan perpustakaan MP3 seperti LAME lame.sourceforge.net
smp
6

Untuk menyandikan mp3 audio ffmpeg.org menunjukkan contoh berikut:

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

Saya mengekstrak audio dari video hanya dengan mengganti input.wavdengan nama file video. The 2berarti 190 kb / sec. Anda dapat melihat tingkat kualitas lainnya di tautan saya di atas.

Suragch
sumber
Contoh itu adalah untuk mengonversi file audio ke format lain, bukan untuk mengekstraknya dari video.
Iulian Onofrei
@IulianOnofrei, seperti yang saya jelaskan dalam jawaban saya, Anda dapat mengganti file audio dengan file video. Ini berhasil untuk saya.
Suragch
6

Inilah yang baru saja saya gunakan:

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

Penjelasan opsi:

  • my.mkv adalah file video sumber, Anda dapat menggunakan format lain juga
  • -map 0:3berarti saya ingin streaming ke-3 dari file video. Letakkan N Anda di sana - file video sering kali memiliki beberapa stream audio; Anda dapat menghilangkannya atau menggunakan -map 0:auntuk mengambil aliran audio default. Jalankan ffprobe my.mkvuntuk melihat stream apa yang dimiliki file video.
  • my.mp3 adalah nama file audio target, dan ffmpeg tahu saya ingin MP3 dari ekstensi. Dalam kasus saya, sumber audio stream adalah ac3 DTS dan hanya menyalin bukan yang saya inginkan
  • 320k adalah bitrate target yang diinginkan
  • -vn berarti saya tidak ingin video dalam file target
Artem Vasiliev
sumber
2

Tebakan saja:

-ab 192

seharusnya

-ab 192k

Sepertinya itu bisa menjadi masalah, tapi mungkin ffmpeg cukup pintar untuk memperbaikinya.

Semrawut
sumber
2
Komentar yang valid, dan saya mengedit pertanyaan OP untuk mengubahnya, tetapi ini tidak mengubah apa pun (paling banyak, ini menghasilkan peringatan).
Jean-Philippe Pellet
2

Jika audio yang dibungkus dengan avi bukan format mp3 untuk memulai, Anda mungkin perlu menentukan -acodec mp3sebagai parameter tambahan. Atau apa pun codec mp3 Anda (pada sistem Linux, mungkin -acodec libmp3lame). Anda juga bisa mendapatkan efek yang sama, platform-agnostik, dengan menetapkan -f mp3"memaksa" format ke mp3, meskipun tidak semua versi ffmpeg masih mendukung peralihan itu. Mileage Anda Mungkin Bervariasi.

Xheralt
sumber
2

Untuk mengekstrak tanpa konversi, saya menggunakan entri menu konteks - sebagai tindakan khusus pengelola file di Linux - untuk menjalankan yang berikut (setelah memeriksa jenis audio yang berisi video; contoh untuk video yang berisi oggaudio):

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

yang didasarkan pada perintah ffmpeg ffmpeg -i INPUT -map 0:a -c:a copy OUTPUT.

Saya menggunakannya -map 0:1tanpa masalah, tetapi, seperti yang dikatakan dalam komentar oleh @LordNeckbeard, "Stream 0:1tidak dijamin untuk selalu berupa audio. Menggunakannya -map 0:abukan -map 0:1akan menghindari ambiguitas."


sumber
1
Stream 0:1tidak dijamin selalu berupa audio. Menggunakan -map 0:abukannya -map 0:1akan menghindari ambiguitas.
Logan
@ LordNeckbeard ~ Saya akan memperhitungkannya, terima kasih.
Saya dulu mediainfomenentukan trek audio, dan memilihnya seperti ini: di -map 0:a:1mana a: 1 adalah indeks trek audio kedua, thx! -c:a copymembuatnya lebih cepat!
Aquarius Power
1

Untuk orang yang mencari cara yang lebih sederhana untuk mengekstrak audio dari file video sambil mempertahankan parameter file video asli, Anda dapat menggunakan:

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

Misalnya, menjalankan:

ffmpeg -i screencap.mov screencap.mp3

mengekstrak mp3file audio dari movfile video.

Iulian Onofrei
sumber
Sederhana dan berhasil. Mengapa semua solusi lain begitu rumit? +1
Scott Biggs
1
Pertanyaannya adalah, mengapa ini menghapus suara?
Iulian Onofrei
-1

Menggunakan -b:a bukan -abseperti yang -absudah ketinggalan zaman sekarang, juga pastikan jalur file input Anda sudah benar.

Untuk mengekstrak audio dari video saya telah menggunakan perintah di bawah ini dan berfungsi dengan baik.

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

Sini,

  • -y - Timpa file keluaran tanpa bertanya.
  • -i - FFmpeg membaca dari sejumlah "file" input yang ditentukan oleh -i opsi
  • -vn - Nonaktifkan rekaman video
  • -ar - mengatur laju pengambilan sampel untuk streaming audio jika disandikan
  • -ac - Atur jumlah saluran audio.
  • -b:a - Atur bitrate audio
  • -f - format

Lihat ini untuk contoh lengkap proyek android FFmpeg saya di GitHub.

Pengembang Android
sumber