แยกชุดเสียงด้วย avconv โดยไม่มีการแปลงรหัส


14

ฉันมีไฟล์ mp4 ประมาณ 70 ไฟล์และฉันต้องการแยกไฟล์เสียงโดยตรงโดยไม่ต้องแปลงรหัสเพิ่มเติม ไฟล์ mp4 ทั้งหมดมีไฟล์เสียง aac

ฉันเข้าใจว่าฉันสามารถใช้คำสั่งต่อไปนี้เพื่อแยกไฟล์เสียงจากไฟล์ mp4 อย่างใดอย่างหนึ่ง:

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

ฉันจะแยกไฟล์เสียงทั้งหมดจากไฟล์ mp4 ทั้งหมด 70 ไฟล์ได้อย่างไรฉันจึงจบด้วยไฟล์ aac 70 ไฟล์

คำตอบ:


21

คุณสามารถใช้การวนรอบแบบง่าย:

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

หรือหนึ่งบรรทัด:

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

สิ่งที่จะถูกเรียกใช้avconvครั้งเดียวสำหรับทุกไฟล์ที่มีชื่อเหมือน*.mp4ที่ชื่อไฟล์จะถูกเก็บไว้ใน${i}ตัวแปร

${i%.mp4}หมายถึง${i}(เช่น. ชื่อไฟล์) โดย.mp4ถอดออกจากจุดสิ้นสุด


2
IIRC ไฟล์ raw aac ไม่สามารถมีข้อมูลเมตาได้ หากคุณต้องการเก็บข้อมูลเมตาจากไฟล์ดั้งเดิมให้ใช้ m4a (ซึ่งเป็นเพียงชื่ออื่นสำหรับ mp4 แต่ได้รับการยอมรับอย่างกว้างขวางจากเครื่องเล่นเสียง) แทนที่จะเป็น aac เป็นนามสกุลไฟล์
evilsoup

ตัวเลือก -map มีไว้ทำอะไร? ทำไมคุณเลือกสตรีม 0: 1 มากกว่าสตรีมอื่น ๆ เช่น 0: 0, 0: 2
qed

ฉันเลิกใช้ตัวเลือก -map และใช้งานได้ดี
qed

เพื่อใช้คำสั่งนี้ในการกระทำที่กำหนดเองของ Thunar และคล้ายกันมันจะทำงานถ้าเพิ่มไปยังสคริปต์และในการกระทำของ Thunar: bash /path/to/the/script %F- เช่นที่นี่

2
@qed: การปล่อย-mapอาจยังทำให้วิดีโอถูกพิจารณาเมื่อคุณเปลี่ยนไปใช้รูปแบบเอาต์พุตอื่น (หากรูปแบบนั้นสามารถมีได้ทั้งเสียงและวิดีโอ) มันปลอดภัยกว่าที่จะเก็บไว้ตามที่เป็นอยู่
ดร. Sybren

5

โดยทั่วไปคำตอบของเสี่ยวจะมีประโยชน์มากที่สุดหากคุณมีไฟล์ทั้งหมดในไดเรกทอรีเดียว แต่ถ้ามีไฟล์ MP4 กระจัดกระจายอยู่ในไดเรกทอรีต่าง ๆ คุณสามารถใช้findคำสั่งนี้เพื่อแปลงไฟล์ทั้งหมด

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

วิธีนี้ใช้รูปแบบที่แตกต่างกันเล็กน้อยของการแทนที่สตริง bash ในตอนท้าย: "$ {0 /% mp4 / m4a}" บอก bash ให้แทนที่ mp4 ด้วย m4a แต่เฉพาะในกรณีที่ mp4 อยู่ที่ส่วนท้ายของสตริง


ฉันไม่เคยรู้เลยว่าทุบตีนั้นมีการทดแทนประเภทนั้น เยี่ยมมาก :)
แอนดรูว์กันเนอร์

1
@xiao หากคุณปล่อยออกไป%มันจะทำการทดแทนสำหรับอินสแตนซ์แรกของสตริงที่พบ คุณสามารถใช้#เพื่อทำให้มันแทนที่สตริงได้ถ้ามันอยู่ที่จุดเริ่มต้นของตัวแปร ดังนั้น $ {0 / mp4 / m4a} จะแทนที่อินสแตนซ์แรกของ mp4 ด้วย m4a (ซึ่งอาจเป็นปัญหาหากคุณมีชื่อไฟล์แปลก ๆ ); และ $ {0 / # mp4 / m4a} จะแทนที่ mp4 สำหรับ m4a แต่เฉพาะในกรณีที่ค่าสตริงของตัวแปรเริ่มต้นด้วย mp4 (ไม่มีการใช้งานที่นี่แน่นอน แต่อาจมีประโยชน์ในที่อื่น)
evilsoup

3

เพื่อหลีกเลี่ยงการหลายไฟล์ถูกประมวลผลในเวลาเดียวกัน (ซึ่งอาจจะใช้ทรัพยากรมากเกินไป) parallelการใช้งาน โดยค่าเริ่มต้นจะทำทีละงานเท่านั้น หากคุณต้องการใช้หลายคอร์ของ CPU แบบขนานลองparallel -j 4 ...4 งานพร้อมกัน man parallelยังตรวจสอบ

sudo apt-get install parallel

บรรทัดนี้จะแยกaacไฟล์เสียงจากวิดีโอที่เลือกและใส่ลงในm4aคอนเทนเนอร์

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

เมื่อทำงานตรงใน CLI ให้แทนที่%Fด้วยรายการไฟล์อินพุตของคุณ *.mp4เช่น

แรงบันดาลใจจากคำตอบนี้โดยคำตอบก่อนหน้าสำหรับคำถามนี้และโดยความคิดเห็นของevilsoupไปที่หลัง (พูดว่า: 'ไฟล์ raw aac ไม่สามารถมีข้อมูลเมตาถ้าคุณต้องการเก็บเมตาดาต้าจากไฟล์ต้นฉบับแล้วใช้ m4a (ซึ่ง เป็นชื่ออื่นสำหรับ mp4 แต่ได้รับการยอมรับอย่างกว้างขวางจากเครื่องเล่นเสียง) แทนที่จะเป็น aac เป็นนามสกุลไฟล์ ' )

ฉันใช้คำสั่งดังกล่าวในการกระทำที่กำหนดเองของ Thunar

ป้อนคำอธิบายรูปภาพที่นี่

จำกัด แอปพลิเคชันสำหรับวิดีโอที่aacมีเสียง

ป้อนคำอธิบายรูปภาพที่นี่

หากต้องการให้หน้าต่างเทอร์มินัลเปิดในระหว่างการประมวลผลซึ่งจะปิดในตอนท้ายคำสั่งสามารถเปลี่ยนแปลงได้เช่น:

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

2

ฉันขยายคำตอบของ @ Xiao-Long Chen เปลี่ยนเป็นสคริปต์ที่ข้ามไฟล์เมื่อไฟล์เอาต์พุตใหม่กว่า:

#!/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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.