dekompresyon olmadan ffmpeg ile mp4 dosyalarından ses toplu nasıl (otomatik ses codec algılama)?


19

228 mp4 dosyam (2.6GB) var ve bunlardan ses çıkarmak istiyorum (mp3 veya ogg). Onları toplu olarak çıkarmak istiyorum - tercihen bash ile. Tüm dosyaların 2006-2012 yılları arasında farklı yıllarda kaydedildikleri ses kodeklerini kullanıp kullanmadığından emin değilim.

Hepsini döngü, dosya adını seçin, ses codec bileşeni tespit etmek ve ses çıkarmak için ffmpeg kullanmak istiyorum.

Mümkün mü?


Bu bir komut dosyasıdır ve Ubuntu ile hiçbir ilgisi yoktur. Burada konu dışı değil, ama SO veya unix.SE sormak için daha iyi bir yer olabilir.
Mahesh

Teşekkürler. Bir dahaki sefere daha uygun bir yerde böyle bir soru sormaya çalışacağım.
wryrych

Yanıtlar:


29

"Onlardan ses çıkarmak (mp3 veya ogg)" istediğinizi söylüyorsunuz. Ama ya mp4 dosyasındaki ses bunlardan biri değilse? yine de kod dönüştürmeniz gerekir. Peki neden ses formatı algılamasını ffmpeg'e bırakmıyorsunuz?

Bir dosyayı dönüştürmek için:

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

Birçok dosyayı dönüştürmek için:

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

Tabii ki bit hızı gibi şeyleri ayarlamak için istediğiniz ses kodlaması için herhangi bir ffmpeg parametresini seçebilirsiniz.

Kullanım -acodec libmp3lameuzantısını değiştirmek ve .oggiçin .mp3mp3 kodlama için.

İstediğiniz ses gerçekten çıkarmak için, ses parçasını kullanarak bir dosyaya "kopyalayabilirsiniz" -acodec copy. Tabii ki, temel fark kod dönüştürmenin yavaş ve cpu yoğun olması, ancak baytları bir dosyadan diğerine taşıdığınızda kopyalama gerçekten hızlıdır. Yalnızca ses parçasını nasıl kopyalayacağınız aşağıda açıklanmıştır (mp3 formatında olduğu varsayılarak):

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

Bu durumda, audiofile biçim o Not sahip konteyner neler tutarlı olacak şekilde (ses AAC formatı ise yani sen söylemek zorunda audiofile.aac). ffprobeHangi codec bileşenine sahip olduğunuzu görmek için komutu kullanabilirsiniz , bu bazı bilgiler sağlayabilir:

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

Ses kodekini otomatik olarak ayrıştırmanın ve ses dosyasını buna göre adlandırmanın olası bir yolu:

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

Notlar: çıktı dosyaları outputbaşlangıçta oluşturduğu alt dizinde oluşturulur (gerekirse). Mp3 ve vorbis dışındaki diğer kodekler için sesi ogg'e dönüştürür. Ubuntu 14.04'te standart depolarda ffmpeg yoktur, ancak gerekli yazılımı almak için ppa: mc3man / trusty-media deposu ekleyebilir ve ffmpeg paketini kurabilirsiniz. Ayrıntılar için buraya bakın.


Yanlış koydum. Ben mp3 veya ogg sahip olmak istedim ama ses kodek farklı olduğunu fark - bu örnekte aac. Bu yüzden zaten onları kodlamalıyım. Yardımın için çok teşekkürler!
wryrych

Otomajik örneğiniz, içinde boşluk olan dosya adlarıyla kesiliyor çünkü ffprobe alt deyiminde $ file teklif etmediniz. Şu şekilde değiştiriliyor: * mp4 * avi'deki dosya için; ffmpeg -i "$ file" -vn -acodec kopyala "$ file" yazın. ffprobe "$file" 2>&1 |sed -rn 's/.*Audio: (...), .*/\1/p'; done Bunu düzeltir.
Andrew Beals

+1 ama bu cevap bir güncelleme kullanabilir gibi görünüyor:This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Nicolas Raoul

ffmpegveya ffprobeUbuntu 14.04 veya üstü için kullanılamaz.
Jarno

1
@jarno gerçek ffmpeg 15.04 de Ubuntu döndü ve Libav saman gibi görünüyor avconvve avprobeolmuştur 15.10 çıkarıldı .
llogan

1

Nicolas Raoul'un belirttiği gibi, bunun güncellenmesi gerekiyor. Roadmr'ın verdiği aynı satır ancak bunun yerine avconv kullanıyor:

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


Bu artık modası geçmiş. FFmpeg geri döndü ve Libav gitti.
llogan

Kesinlikle doğru. Ffmpeg'in öleceğini düşünen biri varsa, bunu okuyun: en.wikipedia.org/wiki/Libav#Confusion
Scooby-2
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.