Pertanyaan Ekstrak audio batch dengan avconv tanpa transcoding


Saya memiliki sekitar 70 file mp4, dan saya ingin mengekstrak file audio langsung tanpa transcoding lebih lanjut. Semua file mp4 memiliki file audio aac.

Saya mengerti saya dapat menggunakan perintah berikut untuk mengekstrak file audio dari salah satu file mp4:

avconv -i "INPUT FILE" -map 0:1 -c:a copy "OUTPUT FILE"

Bagaimana cara mengekstrak semua file audio dari semua file 70 mp4, jadi saya berakhir dengan 70 file aac?


13
2018-01-04 00:41


asal




Jawaban:


Anda dapat menggunakan loop sederhana:

for i in *.mp4; do
    avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"
done

atau pada satu baris:

for i in *.mp4; do avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"; done

Apa yang dilakukan dijalankan avconv sekali untuk setiap file bernama suka *.mp4 dimana nama file disimpan dalam ${i} variabel.

${i%.mp4} cara ${i} (mis. nama file) dengan .mp4 menanggalkan dari akhir.


19
2018-01-04 02:38



IIRC, file aac mentah tidak dapat berisi metadata; jika Anda ingin menyimpan metadata dari file asli kemudian gunakan m4a (yang hanya nama lain untuk mp4, tetapi cukup dikenal luas oleh pemutar audio) daripada aac sebagai ekstensi file. - evilsoup
Apa opsi -map untuk? Mengapa Anda memilih aliran 0: 1 daripada streaming lainnya, seperti 0: 0, 0: 2? - qed
Saya menjatuhkan opsi -map dan itu bekerja dengan baik - qed
untuk menggunakan perintah ini dalam tindakan kustom Thunar dan serupa, ini berfungsi jika ditambahkan ke skrip dan tindakan Thunar: bash /path/to/the/script %F - suka sini - cipricus
@qed: menjatuhkan -map masih dapat menyebabkan video dianggap ketika Anda beralih ke format output lain (jika format itu dapat berisi audio dan video). Lebih aman menyimpannya apa adanya. - dr. Sybren


Jawaban Xiao umumnya paling berguna jika Anda memiliki semua file dalam satu direktori; tetapi jika ada file MP4 yang tersebar di berbagai direktori, Anda dapat menggunakan ini find perintah untuk mengkonversikan semuanya.

find . -type f -name '*.mp4' -exec bash -c 'avconv -i "$0" -c:a copy "${0/%mp4/m4a}"' {} \;

Ini menggunakan bentuk yang sedikit berbeda dari substitusi string bash di akhir: "$ {0 /% mp4 / m4a}" memberitahu bash untuk mengganti mp4 dengan m4a, tetapi hanya jika mp4 berada di ujung string.


5
2018-01-04 03:21



Saya tidak pernah tahu bahwa bash memiliki jenis substitusi seperti itu. Awesome :) - Andrew Gunnerson
@xiao Jika Anda meninggalkan %, itu akan melakukan substitusi untuk contoh pertama dari string yang ditemukannya; Anda juga bisa menggunakan # untuk membuatnya hanya mengganti string jika di mulai suatu variabel; jadi $ {0 / mp4 / m4a} akan menggantikan instance mp4 pertama dengan m4a (yang bisa menjadi masalah jika Anda memiliki nama file yang benar-benar aneh); dan $ {0 / # mp4 / m4a} akan menggantikan mp4 untuk m4a, tetapi hanya jika nilai string variabel dimulai dengan mp4 (tidak digunakan di sini, jelas, tetapi mungkin berguna di tempat lain). - evilsoup


Untuk menghindari beberapa file diproses pada saat yang sama (yang mungkin menggunakan terlalu banyak sumber daya), gunakan parallel. Secara default, ini hanya melakukan satu pekerjaan pada satu waktu. Jika Anda ingin menggunakan banyak core CPU secara paralel, cobalah parallel -j 4 ... untuk 4 pekerjaan secara paralel. Juga periksa man parallel.

sudo apt-get install parallel

Baris ini akan diekstrak aac file audio dari video terpilih dan masukkan ke dalamnya m4a kontainer.

parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F

Saat bekerja lurus di CLI, gantilah%F dengan daftar file input Anda. Misalnya. *.mp4.

Terinspirasi oleh ini jawaban, oleh jawaban sebelumnya untuk pertanyaan ini, dan oleh evilsoupkomentar kepada yang terakhir (mengatakan: file raw aac tidak dapat berisi metadata; jika Anda ingin menyimpan metadata dari file asli, gunakan m4a (yang hanya nama lain untuk mp4, tetapi cukup dikenal oleh pemutar audio) daripada aac sebagai ekstensi file ').

Saya menggunakan perintah tersebut dalam tindakan kustom Thunar,

enter image description here

membatasi aplikasi untuk video yang mengandung aac audio.

enter image description here

Agar jendela terminal terbuka selama pemrosesan, yang menutup di bagian akhir, perintah dapat diubah seperti:

 gnome-terminal -e "parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F"

3
2018-05-12 16:00





Saya memperpanjang jawaban Xiao-Long Chen, mengubahnya menjadi skrip yang melewatkan file ketika file keluaran lebih baru:

#!/bin/bash

for file in *.mp4; do
    OUT="${file/.mp4/.m4a}"

    if [ "$file" == "$OUT" ]; then
        echo "Unable to handle $file" >&2
        exit 1
    fi

    if [ "$OUT" -nt "$file" ]; then
        echo "Skipping $file; output file is newer."
        continue
    fi

    echo "Converting \"$file\" -> \"$OUT\""
    avconv -loglevel warning -i "$file" -map 0:1 -c:a copy "$OUT"
done

2
2017-07-01 08:03