ฉันจะแยกเสียงจากไฟล์ mp4 ด้วย ffmpeg โดยไม่ต้องคลายการบีบอัด (การตรวจจับตัวแปลงสัญญาณเสียงอัตโนมัติ) ได้อย่างไร?


19

ฉันมีไฟล์ 228 mp4 (2.6GB) และต้องการแยกเสียงจากไฟล์เหล่านั้น (mp3 หรือ ogg) ฉันต้องการแบทช์แยก - โดยเฉพาะอย่างยิ่งกับ bash ฉันไม่แน่ใจว่าไฟล์ทั้งหมดใช้ตัวแปลงสัญญาณเสียงเดียวกันกับที่บันทึกไว้ในหลาย ๆ ปีตั้งแต่ปี 2549-2555

ฉันต้องการวนลูปทั้งหมด, เลือกชื่อไฟล์, ตรวจหาตัวแปลงสัญญาณเสียงและใช้ ffmpeg เพื่อแยกเสียง

เป็นไปได้ไหม?


นี่เป็นคำถามเกี่ยวกับการเขียนสคริปต์และไม่เกี่ยวข้องกับ Ubuntu มันไม่ได้อยู่นอกหัวข้อที่นี่ แต่ SO หรือ unix.SE อาจเป็นสถานที่ที่ดีกว่าที่จะถาม
Mahesh

ขอบคุณ ครั้งต่อไปฉันจะพยายามถามคำถามในที่ที่เหมาะสมกว่า
Wryrych

คำตอบ:


28

คุณบอกว่าคุณต้องการที่จะ "แยกเสียงจากพวกเขา (mp3 หรือ ogg)" แต่ถ้าเสียงในไฟล์ mp4 ไม่ใช่หนึ่งในนั้นล่ะ? คุณจะต้องแปลงรหัสต่อไป เหตุใดจึงไม่ปล่อยการตรวจจับรูปแบบเสียงสูงสุด ffmpeg

วิธีแปลงไฟล์หนึ่งไฟล์:

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

ในการแปลงไฟล์จำนวนมาก:

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

แน่นอนคุณสามารถเลือกพารามิเตอร์ ffmpeg ใด ๆ สำหรับการเข้ารหัสเสียงที่คุณต้องการเพื่อกำหนดสิ่งต่าง ๆ เช่นบิตเรตและอื่น ๆ

ใช้-acodec libmp3lameและเปลี่ยนนามสกุลจาก.oggเป็น.mp3เข้ารหัส mp3

หากสิ่งที่คุณต้องการคือจริงๆดึงเสียงคุณสามารถเพียงแค่ "คัดลอก" -acodec copyแทร็กเสียงไปยังแฟ้มใช้ แน่นอนความแตกต่างที่สำคัญคือการแปลงรหัสช้าและใช้ซีพียูมากในขณะที่การคัดลอกนั้นรวดเร็วมากเพราะคุณเพิ่งย้ายไบต์จากไฟล์หนึ่งไปอีกไฟล์หนึ่ง ต่อไปนี้เป็นวิธีคัดลอกแทร็กเสียง (สมมติว่าอยู่ในรูปแบบ MP3):

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

ทราบว่าในกรณีนี้รูปแบบ AudioFile มีเพื่อให้สอดคล้องกับสิ่งที่ภาชนะที่มี (เช่นถ้าเสียงเป็นรูปแบบ AAC, คุณจะพูดaudiofile.aac) คุณสามารถใช้ffprobeคำสั่งเพื่อดูตัวแปลงสัญญาณที่คุณมีซึ่งอาจให้ข้อมูลบางอย่าง:

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

วิธีที่เป็นไปได้ในการแยกวิเคราะห์ตัวแปลงสัญญาณเสียงโดยอัตโนมัติและตั้งชื่อไฟล์เสียงตามนั้นจะเป็น:

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

หมายเหตุ: ไฟล์ที่ส่งออกจะถูกสร้างขึ้นในไดเรกทอรีย่อยoutputมันจะสร้างขึ้นในการเริ่มต้น (ถ้าจำเป็น) สำหรับตัวแปลงสัญญาณอื่นที่ไม่ใช่ mp3 และ vorbis จะแปลงเสียงเป็น ogg Ubuntu 14.04 ไม่มี ffmpeg ในคลังเก็บมาตรฐาน แต่คุณสามารถเพิ่มที่เก็บ ppa: mc3man / trusty-media และติดตั้งแพ็คเกจ ffmpeg เพื่อรับซอฟต์แวร์ที่จำเป็น ดูรายละเอียดที่นี่


ฉันใส่ผิด ฉันต้องการมี mp3 หรือ ogg แต่เมื่อคุณสังเกตเห็นว่าตัวแปลงสัญญาณเสียงแตกต่าง - aac ในตัวอย่างนี้ ดังนั้นฉันต้องแปลงรหัสพวกเขาต่อไป ขอบคุณมากสำหรับความช่วยเหลือของคุณ!
Wryrych

ตัวอย่างอัตโนมัติของคุณแบ่งด้วยชื่อไฟล์ที่มีช่องว่างในนั้นเพราะคุณไม่ได้พูด $ file ในคำสั่งย่อย ffprobe เปลี่ยนเป็น: สำหรับไฟล์ใน * mp4 * avi; ทำ ffmpeg -i "$ file" -vn -acodec copy "$ file" ffprobe "$file" 2>&1 |sed -rn 's/.*Audio: (...), .*/\1/p'; แก้ไขแล้ว
Andrew Beals

+1 แต่ดูเหมือนว่าคำตอบนี้สามารถใช้การอัปเดตได้:This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Nicolas Raoul

ffmpegหรือffprobeไม่สามารถใช้ได้กับ Ubuntu 14.04 หรือใหม่กว่า
jarno

1
@jarno จริงffmpeg กลับไปอูบุนตูใน 15.04และดูเหมือนว่าแกลบ Libav avconvและavprobeได้รับการถอดออกใน 15.10
llogan

1

ดังที่ Nicolas Raoul ระบุไว้สิ่งนี้จำเป็นต้องได้รับการอัปเดต นี่คือบรรทัดเดียวกับที่ roadmr ให้ แต่ใช้ avconv แทน:

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


สิ่งนี้ล้าสมัยแล้ว FFmpeg กลับมาและ Libav หายไป
llogan

ถูกต้องอย่างแน่นอน หากใครคิดว่า ffmpeg กำลังจะตายให้อ่านสิ่งนี้: en.wikipedia.org/wiki/Libav#Confusion
Scooby-2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.