bagaimana saya bisa mengekstrak audio dari file mp4 dengan ffmpeg tanpa dekompresi (deteksi codec audio otomatis)?

19

Saya memiliki 228 file mp4 (2.6GB) dan ingin mengekstrak audio dari mereka (mp3 atau ogg). Saya ingin mengekstraknya secara batch - sebaiknya dengan bash. Saya tidak yakin apakah semua file menggunakan codec audio yang sama seperti yang direkam pada tahun yang berbeda, mulai dari 2006-2012.

Saya ingin mengulang semuanya, memilih nama file, mendeteksi codec audio dan menggunakan ffmpeg untuk mengekstrak audio.

Apa itu mungkin?

Wryrych
sumber
Ini adalah pertanyaan skrip dan karena itu tidak ada hubungannya dengan Ubuntu. Ini bukan topik di sini, tetapi SO atau unix.SE mungkin tempat yang lebih baik untuk bertanya.
Mahesh
Terima kasih. Lain kali saya akan mencoba mengajukan pertanyaan seperti itu di tempat yang lebih tepat.
wryrych

Jawaban:

28

Anda mengatakan ingin "mengekstrak audio dari mereka (mp3 atau ogg)". Tetapi bagaimana jika audio dalam file mp4 bukan salah satunya? Anda harus tetap transcode. Jadi mengapa tidak membiarkan deteksi format audio hingga ffmpeg?

Untuk mengonversi satu file:

ffmpeg -i videofile.mp4 -vn -acodec libvorbis audiofile.ogg

Untuk mengonversi banyak file:

for vid in *.mp4; do ffmpeg -i "$vid" -vn -acodec libvorbis "${vid%.mp4}.ogg"; done

Anda tentu saja dapat memilih parameter ffmpeg untuk pengkodean audio yang Anda sukai, untuk mengatur hal-hal seperti bitrate dan sebagainya.

Gunakan -acodec libmp3lamedan ubah ekstensi dari .oggmenjadi .mp3untuk pengodean mp3.

Jika yang Anda inginkan adalah benar-benar mengekstrak audio, Anda cukup "menyalin" trek audio ke file menggunakan -acodec copy. Tentu saja, perbedaan utama adalah bahwa transcoding lambat dan cpu-intensif, sementara menyalin sangat cepat karena Anda hanya memindahkan byte dari satu file ke file lainnya. Berikut cara menyalin hanya trek audio (dengan asumsi itu dalam format mp3):

ffmpeg -i videofile.mp4 -vn -acodec copy audiofile.mp3

Perhatikan bahwa dalam kasus ini, format audiofile memiliki harus konsisten dengan apa yang wadah memiliki (yaitu jika audio format AAC, Anda harus mengatakan audiofile.aac). Anda dapat menggunakan ffprobeperintah untuk melihat codec yang Anda miliki, ini dapat memberikan beberapa informasi:

ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "videofile.mp4"

Cara yang mungkin untuk menguraikan codec audio secara otomatis dan memberi nama file audio yang sesuai adalah:

mkdir -p output
# current directory has to contain at least one .mp4 file 
for vid in *.mp4; do
   codec="$(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "$vid")"
   case "$codec" in
    mp3    ) filetype=mp3 ;;
    vorbis ) filetype=ogg ;;
    *      ) filetype= ;;
   esac

   if [ "$filetype" ]; then 
    ffmpeg -i "$vid" -vn -acodec copy output/"${vid%.*}"."$filetype"
   else
    ffmpeg -i "$vid" -vn -acodec libvorbis output/"${vid%.*}".ogg
done

Catatan: file output dibuat di sub-direktori outputyang dibuatnya di awal (jika perlu). Untuk codec lain selain mp3 dan vorbis, mengkonversi audio ke ogg. Ubuntu 14.04 tidak memiliki ffmpeg dalam repositori standar, tetapi Anda dapat menambahkan ppa: mc3man / trusty-media repositori dan menginstal paket ffmpeg untuk mendapatkan perangkat lunak yang diperlukan. Lihat di sini untuk detailnya.

roadmr
sumber
Saya salah paham. Saya ingin punya mp3 atau ogg tetapi ketika Anda perhatikan codec audio berbeda - aac dalam contoh ini. Jadi saya tetap harus transcode mereka. Terima kasih banyak atas bantuan Anda!
wryrych
Contoh automagic Anda rusak dengan nama file yang memiliki spasi di dalamnya karena Anda tidak mengutip $ file dalam sub-pernyataan ffprobe. Mengubahnya menjadi: untuk file dalam * mp4 * avi; lakukan ffmpeg -i "$ file" -vn -acodec salin "$ file". ffprobe "$file" 2>&1 |sed -rn 's/.*Audio: (...), .*/\1/p'; melakukan perbaikan itu.
Andrew Beals
+1 tetapi sepertinya jawaban ini dapat menggunakan pembaruan:This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Nicolas Raoul
ffmpegatau ffprobetidak tersedia untuk Ubuntu 14.04 atau lebih baru.
jarno
1
@jarno The real ffmpeg kembali ke Ubuntu pada 15,04 , dan sepertinya Libav chaff avconvdan avprobetelah dihapus pada 15.10 .
llogan
1

Seperti yang dikatakan Nicolas Raoul, ini perlu diperbarui. Inilah baris yang sama yang diberikan roadmr tetapi menggunakan avconv sebagai gantinya:

for vid in *.mp4; do avconv -i "$vid" "${vid%.mp4}.mp3"; done

Scooby-2
sumber
Ini sudah ketinggalan zaman. FFmpeg kembali dan Libav hilang.
llogan
Tepat sekali. Jika ada yang mengira ffmpeg akan mati, baca ini: en.wikipedia.org/wiki/Libav#Confusion
Scooby-2