Làm cách nào tôi có thể trích xuất hàng loạt âm thanh từ các tệp mp4 bằng ffmpeg mà không cần giải nén (phát hiện codec âm thanh tự động)?


19

Tôi có 228 tệp mp4 (2.6GB) và muốn trích xuất âm thanh từ chúng (mp3 hoặc ogg). Tôi muốn giải nén hàng loạt chúng - tốt nhất là với bash. Tôi không chắc chắn nếu tất cả các tệp sử dụng cùng một codec âm thanh như chúng được ghi lại trong các năm khác nhau, từ 2006-2012.

Tôi muốn lặp qua tất cả chúng, chọn tên tệp, phát hiện codec âm thanh và sử dụng ffmpeg để trích xuất âm thanh.

Có thể không?


Đây là một câu hỏi kịch bản và như vậy không liên quan gì đến Ubuntu. Nó không lạc đề ở đây, nhưng SO hoặc unix.SE có thể là một nơi tốt hơn để hỏi.
Mahesh

Cảm ơn. Lần tới tôi sẽ cố gắng hỏi một câu hỏi như vậy ở nơi thích hợp hơn.
wryrych

Câu trả lời:


28

Bạn nói rằng bạn muốn "trích xuất âm thanh từ họ (mp3 hoặc ogg)". Nhưng nếu âm thanh trong tệp mp4 không phải là một trong số đó thì sao? dù sao bạn cũng phải chuyển mã. Vậy tại sao không để phát hiện định dạng âm thanh lên đến ffmpeg?

Để chuyển đổi một tập tin:

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

Để chuyển đổi nhiều tập tin:

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

Tất nhiên bạn có thể chọn bất kỳ tham số ffmpeg nào cho mã hóa âm thanh mà bạn thích, để đặt những thứ như bitrate, v.v.

Sử dụng -acodec libmp3lamevà thay đổi phần mở rộng từ .oggsang .mp3mã hóa mp3.

Nếu điều bạn muốn là thực sự trích xuất âm thanh, bạn chỉ cần "sao chép" đoạn âm thanh vào một tệp bằng cách sử dụng -acodec copy. Tất nhiên, sự khác biệt chính là chuyển mã chậm và thâm dụng cpu, trong khi sao chép thực sự nhanh chóng khi bạn chỉ di chuyển byte từ tệp này sang tệp khác. Đây là cách sao chép chỉ bản nhạc âm thanh (giả sử nó ở định dạng mp3):

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

Lưu ý rằng trong trường hợp này, định dạng audiofile để phù hợp với những gì container có (ví dụ: nếu âm thanh định dạng AAC, bạn phải nói audiofile.aac). Bạn có thể sử dụng ffprobelệnh để xem codec nào bạn có, điều này có thể cung cấp một số thông tin:

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

Một cách có thể để tự động phân tích codec âm thanh và đặt tên tệp âm thanh phù hợp sẽ là:

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

Ghi chú: các tệp đầu ra được tạo trong thư mục con outputmà nó tạo vào đầu (nếu cần). Đối với các codec khác ngoài mp3 và vorbis, nó chuyển đổi âm thanh thành ogg. Ubuntu 14.04 không có ffmpeg trong kho lưu trữ tiêu chuẩn, nhưng bạn có thể thêm kho lưu trữ ppa: mc3man / trusty-media và cài đặt gói ffmpeg để có được phần mềm cần thiết. Xem ở đây để biết chi tiết.


Tôi đặt nó sai. Tôi muốn có mp3 hoặc ogg nhưng như bạn nhận thấy codec âm thanh thì khác - aac trong ví dụ này. Vì vậy, tôi phải chuyển mã chúng bằng mọi giá. Cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn!
wryrych

Ví dụ tự động của bạn phá vỡ các tên tệp có khoảng trắng trong đó vì bạn đã không trích dẫn tệp $ trong câu lệnh phụ ffprobe. Thay đổi nó thành: cho tập tin trong * mp4 * avi; làm ffmpeg -i "$ file" -vn -acodec sao chép "$ file". ffprobe "$file" 2>&1 |sed -rn 's/.*Audio: (...), .*/\1/p'; Đã sửa xong.
Andrew Beals

+1 nhưng có vẻ như câu trả lời này có thể sử dụng bản cập nhật:This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Nicolas Raoul

ffmpeghoặc ffprobekhông có sẵn cho Ubuntu 14.04 trở lên.
jarno 18/03/2016

1
@jarno Thực tế đã ffmpeg trở lại với Ubuntu vào ngày 15.04 , và nó trông giống như trò lừa Libav avconvavprobeđã bị xóa trong 15.10 .
llogan 18/03/2016

1

Như Nicolas Raoul đã nêu, điều này cần cập nhật. Đây là cùng một dòng mà roadmr đã đưa ra nhưng sử dụng avconv thay thế:

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


Điều này bây giờ đã lỗi thời. FFmpeg đã trở lại và Libav đã biến mất.
llogan 18/03/2016

Chuẩn xác. Nếu bất cứ ai nghĩ rằng ffmpeg sẽ chết, hãy đọc nó: en.wikipedia.org/wiki/Libav#Confusion
Scooby-2
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.