ฉันจะแยกเสียงจากวิดีโอด้วย ffmpeg ได้อย่างไร


227

ฉันลองคำสั่งต่อไปนี้เพื่อแยกเสียงจากวิดีโอ:

ffmpeg -i Sample.avi -vn -ar 44100 -ac 2 -ab 192k -f mp3 Sample.mp3

แต่ฉันได้รับผลลัพธ์ต่อไปนี้

libavutil     50.15. 1 / 50.15. 1
libavcodec    52.72. 2 / 52.72. 2
libavformat   52.64. 2 / 52.64. 2
libavdevice   52. 2. 0 / 52. 2. 0
libavfilter    1.19. 0 /  1.19. 0
libswscale     0.11. 0 /  0.11. 0
libpostproc   51. 2. 0 / 51. 2. 0
SamplE.avi: Invalid data found when processing input

ใครช่วยได้บ้าง

คำตอบ:


406

หากต้องการแยกกระแสข้อมูลเสียงโดยไม่ต้องเข้ารหัสใหม่:

ffmpeg -i input-video.avi -vn -acodec copy output-audio.aac
  • -vn ไม่มีวิดีโอ
  • -acodec copy บอกว่าใช้สตรีมเสียงเดียวกันที่มีอยู่แล้ว

อ่านเอาต์พุตเพื่อดูว่าตัวแปลงสัญญาณคืออะไรเพื่อตั้งค่าส่วนขยายชื่อไฟล์ที่ถูกต้อง


54
และแทนที่จะเรียกใช้ ffmpeg เป็นครั้งแรกเพื่อตรวจสอบว่าเป็นออดิโอสตรีมใดให้ใช้ ffprobe input-video.avi
FlorianB

15
หากคุณแยกเสียงจากสตรีมวิดีโอความยาวของเสียงอาจสั้นกว่าความยาวของวิดีโอ เพื่อให้แน่ใจว่าสิ่งนี้จะไม่เกิดขึ้นให้ดึงทั้งเสียงและวิดีโอด้วยการเรียกไปยัง ffmpeg เช่น "ffmpeg -i vid.avi -map 0: audio.wav -map 0: v onlyvideo.avi
BlenderBender

2
มันจะเป็นการดีถ้าคุณขยายคำตอบนี้ด้วยคำสั่งที่ห่อหุ้ม raw AAC ลงในคอนเทนเนอร์ M4A
Gras Double

8
ในกรณีที่ชัดเจนนี้เพียงแค่แทนที่ ".aac" ด้วย ".m4a" ในเส้นทางปลายทาง ffmpeg ฉลาดพอที่จะคาดเดาความตั้งใจของคุณและมันก็สรุปผลลัพธ์ลงในคอนเทนเนอร์ M4A :)
Gras Double

1
FWIW ผมได้สร้างขึ้นมา PHP สคริปต์เพื่อให้ฉันเพียงแค่ระบุไฟล์วิดีโอการป้อนข้อมูลโดยอัตโนมัติและกำหนดส่วนขยายของไฟล์เสียงเอาท์พุท: superuser.com/questions/1301901/...
Gras ดับเบิล

117

หากต้องการเข้ารหัส MP3 คุณภาพสูงจาก AVI ให้ใช้-q: aสำหรับอัตราบิตผันแปร:

ffmpeg -i sample.avi -q:a 0 -map a sample.mp3

หากคุณต้องการแยกส่วนของเสียงจากวิดีโอใช้ตัวเลือก-ssเพื่อระบุเวลาเริ่มต้นและตัวเลือก-tเพื่อระบุระยะเวลาการเข้ารหัสเช่นจาก 3 นาทีและ 5 วินาทีใน 45 วินาที:

ffmpeg -i sample.avi -ss 00:03:05 -t 00:00:45.0 -q:a 0 -map a sample.mp3
  • การประทับเวลาจำเป็นต้องอยู่ในรูปแบบ HH: MM: SS.xxx หรือในไม่กี่วินาที

  • หากคุณไม่ได้ระบุตัวเลือก-tมันจะไปยังจุดสิ้นสุด

ตัวอย่างการทำงาน:

  1. ดาวน์โหลดffmpeg
  2. เปิดพร้อมท์คำสั่ง (เริ่ม> เรียกใช้> CMD) หรือบน Linux / Mac เปิดเทอร์มินัล
  3. cd ไปยังไดเรกทอรีด้วย ffmeg.exe
  4. ออกคำสั่งของคุณและรอไฟล์เอาต์พุต (หรือแก้ไขข้อผิดพลาดใด ๆ )

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


3
นี่คือแนวทางสำหรับ-q:aค่า: trac.ffmpeg.org/wiki/Encode/MP3 Zero เป็นการตั้งค่า VBR ที่มีคุณภาพสูงสุดซึ่งโดยทั่วไปแล้วจะส่งผลให้บิตเรตเฉลี่ยในส่วนบนของช่วง CBR ที่มีสติ (ที่ 320 kbit / s คือ สูงสุดอาจจะเกินกว่าจุดที่การบีบอัดแบบไม่สูญเสียความเหมาะสมมากขึ้น)
Evgeni Sergeev

3
แล้วจะ-map aทำอย่างไร?
Iulian Onofrei

Caveat: นี่เป็นการเข้ารหัสเสียงอีกครั้งด้วยการบีบอัดแบบ lossy ซึ่งจะลดคุณภาพลงเล็กน้อย หากต้นฉบับถูกบีบอัดอยู่แล้วคุณจะลดคุณภาพลงสองครั้งซึ่งอาจจะสังเกตเห็นได้หรือไม่ก็ได้
Davidmh

คำสั่งนี้ใช้งานได้สำหรับฉันเมื่อคำสั่งด้านบน-vnไม่ทำงาน
Mmm

12

บรรทัดคำสั่งนั้นถูกต้องและทำงานกับไฟล์วิดีโอที่ถูกต้อง ฉันจะทำให้แน่ใจว่าคุณได้ติดตั้งไลบรารี่ที่ถูกต้องเพื่อใช้งานกับ mp3, ติดตั้ง lame o probe ด้วย audio codec อื่น

มักจะ

ffmpeg -formats

หรือ

ffmpeg -codecs

จะให้ข้อมูลที่เพียงพอเพื่อให้คุณรู้มากขึ้น


11

ffmpeg -i sample.aviจะให้ข้อมูลรูปแบบเสียง / วิดีโอสำหรับไฟล์ของคุณ ตรวจสอบให้แน่ใจว่าคุณมีไลบรารีที่เหมาะสมที่กำหนดค่าเพื่อวิเคราะห์อินพุตสตรีม ตรวจสอบให้แน่ใจว่าไฟล์ไม่เสียหาย


ตอนนี้ฉันได้รับผลลัพธ์ที่ถูกต้องเมื่อฉันพยายามแสดงความคิดเห็นเดียวกันกับ. mkv vedio.why มันไม่ทำงานสำหรับ. avi มีคำสั่ง ffmpeg ใด ๆ ที่จะแปลง. avi
user1269669

1
AVI หรือ MKV หมายถึงรูปแบบคอนเทนเนอร์ซึ่งสามารถเก็บรูปแบบเสียง / วิดีโอต่าง ๆ ได้มากมาย คุณยังไม่ต้องการแปลงไฟล์เสียง AVI คุณต้องการแปลงไฟล์เสียงภายในไฟล์ AVI ซึ่งคุณยังไม่ได้ระบุ ใช้คำสั่งที่ฉันแสดงไว้ด้านบนเพื่อดูประเภทของแทร็กเสียงที่อยู่ในไฟล์ AVI หากเป็น MP3 คุณจะต้องรวบรวม FFMPEG ด้วยห้องสมุด MP3 เช่น LAME lame.sourceforge.net
smp

6

ในการเข้ารหัส mp3 audio ffmpeg.orgจะแสดงตัวอย่างต่อไปนี้:

ffmpeg -i input.wav -codec:a libmp3lame -qscale:a 2 output.mp3

ฉันแยกเสียงจากวิดีโอเพียงแค่แทนที่input.wavด้วยชื่อไฟล์วิดีโอ ค่า2เฉลี่ย 190 kb / วินาที คุณสามารถดูระดับคุณภาพอื่น ๆ ได้ที่ลิงค์ของฉันด้านบน


ตัวอย่างนั้นใช้สำหรับการแปลงไฟล์เสียงเป็นรูปแบบที่แตกต่างจากไฟล์วิดีโอ
Iulian Onofrei

@IulianOnofrei ตามที่อธิบายไว้ในคำตอบของฉันคุณสามารถแทนที่ไฟล์เสียงด้วยไฟล์วิดีโอ มันใช้งานได้สำหรับฉัน
Suragch

6

นี่คือสิ่งที่ฉันเพิ่งใช้:

ffmpeg -i my.mkv -map 0:3 -vn -b:a 320k my.mp3

คำอธิบายตัวเลือก:

  • my.mkv เป็นไฟล์วิดีโอต้นฉบับคุณสามารถใช้รูปแบบอื่นได้เช่นกัน
  • -map 0:3หมายถึงฉันต้องการกระแสที่ 3 จากไฟล์วิดีโอ วาง N ของคุณไว้ - ไฟล์วิดีโอมักจะมีสตรีมเสียงหลายรายการ คุณสามารถละเว้นหรือใช้-map 0:aเพื่อรับกระแสข้อมูลเสียงเริ่มต้น เรียกใช้ffprobe my.mkvเพื่อดูไฟล์วิดีโอที่สตรีมมี
  • my.mp3 เป็นชื่อไฟล์เสียงเป้าหมายและ ffmpeg หาว่าฉันต้องการ MP3 จากส่วนขยาย ในกรณีของฉันกระแสข้อมูลเสียงคือ ac3 DTS และเพิ่งคัดลอกไม่ใช่สิ่งที่ฉันต้องการ
  • 320k เป็นบิตเรตเป้าหมายที่ต้องการ
  • - หมายถึงฉันไม่ต้องการวิดีโอในไฟล์เป้าหมาย

2

แค่เดา:

-ab 192

ควรจะเป็น

-ab 192k

ดูเหมือนว่าอาจเป็นปัญหา แต่บางที ffmpeg นั้นฉลาดพอที่จะแก้ไขได้


2
ความคิดเห็นที่ถูกต้องและฉันแก้ไขคำถามของ OP เพื่อเปลี่ยน แต่สิ่งนี้ไม่เปลี่ยนแปลงอะไรเลย (ส่วนใหญ่จะเป็นการเตือน)
Jean-Philippe Pellet

2

หากเสียงที่ถูกรวมเข้าไปใน avi ไม่ใช่รูปแบบ mp3 ที่จะเริ่มต้นคุณอาจต้องระบุ-acodec mp3เป็นพารามิเตอร์เพิ่มเติม หรือสิ่งที่ตัวแปลงสัญญาณ mp3 ของคุณคือ (ในระบบ Linux อาจ-acodec libmp3lame) นอกจากนี้คุณยังอาจได้รับผลกระทบเดียวกันซึ่งเป็นแพลตฟอร์มที่ไม่เชื่อเรื่องพระเจ้าโดยระบุ-f mp3ให้ "บังคับ" รูปแบบเป็น mp3 แม้ว่า ffmpeg ทุกรุ่นจะยังคงสนับสนุนสวิตช์นั้นไม่ได้ก็ตาม ไมล์สะสมของคุณอาจแตกต่างกันไป


2

เพื่อแยกโดยไม่ต้องแปลงฉันใช้รายการเมนูบริบท - เป็นดำเนินการจัดการไฟล์ที่กำหนดเองใน Linux - เพื่อเรียกใช้ต่อไปนี้ (หลังจากตรวจสอบประเภทเสียงที่วิดีโอมี; ตัวอย่างสำหรับวิดีโอที่oggมีเสียง):

bash -c 'ffmpeg -i "$0" -map 0:a -c:a copy "${0%%.*}".ogg' %f 

ffmpeg -i INPUT -map 0:a -c:a copy OUTPUTซึ่งขึ้นอยู่กับคำสั่ง ffmpeg

ฉันได้ใช้-map 0:1ในการที่ไม่มีปัญหา แต่ตามที่กล่าวไว้ในความคิดเห็นโดย @LordNeckbeard "กระแส0:1ไม่รับประกันว่าจะเป็นเสียงเสมอการใช้-map 0:aแทน-map 0:1จะหลีกเลี่ยงความคลุมเครือ"


1
สตรีม0:1ไม่รับประกันว่าจะเป็นเสียงเสมอ การใช้-map 0:aแทนที่จะ-map 0:1หลีกเลี่ยงความคลุมเครือ
llogan

@ LordNeckbeard ~ ฉันจะคำนึงถึงเรื่องนั้นด้วยขอบคุณ

ฉันเคยmediainfoกำหนดแทร็กเสียงและเลือกแบบนี้: -map 0:a:1โดยที่: a: 1 เป็นดัชนีแทร็กเสียงที่สอง, ขอบคุณ! -c:a copyทำให้เร็วขึ้นมาก!
กุมภ์อำนาจ

1

สำหรับผู้ที่กำลังมองหาวิธีที่ง่ายกว่าในการแยกไฟล์เสียงออกจากไฟล์วิดีโอขณะที่ยังคงรักษาพารามิเตอร์ของไฟล์วิดีโอต้นฉบับไว้คุณสามารถใช้:

ffmpeg -i <video_file_name.extension> <audio_file_name.extension>

ตัวอย่างเช่นการทำงาน:

ffmpeg -i screencap.mov screencap.mp3

แยกmp3ไฟล์เสียงจากmovไฟล์วิดีโอ


ง่ายและใช้งานได้ เหตุใดโซลูชั่นอื่น ๆ จึงซับซ้อนมาก +1
Scott Biggs

1
คำถามคือทำไมสิ่งนี้ถึงมีการลบคะแนน!
Iulian Onofrei

-1

ใช้-b:aแทนที่จะ-abเป็น-abล้าสมัยในขณะนี้ตรวจสอบให้แน่ใจว่าเส้นทางไฟล์อินพุตของคุณถูกต้อง

เพื่อแยกเสียงจากวิดีโอฉันได้ใช้คำสั่งด้านล่างและทำงานได้ดี

String[] complexCommand = {"-y", "-i", inputFileAbsolutePath, "-vn", "-ar", "44100", "-ac", "2", "-b:a", "256k", "-f", "mp3", outputFileAbsolutePath};

ที่นี่

  • -y - เขียนทับไฟล์เอาต์พุตโดยไม่ถาม
  • -i - FFmpeg อ่านจาก“ ไฟล์” ของไฟล์ที่กำหนดโดยพลการ -iตัวเลือก
  • -vn - ปิดการบันทึกวิดีโอ
  • -ar - ตั้งค่าอัตราการสุ่มตัวอย่างสำหรับสตรีมเสียงหากมีการเข้ารหัส
  • -ac - กำหนดจำนวนช่องสัญญาณเสียง
  • -b:a - ตั้งค่าบิตเรตเสียง
  • -f - รูปแบบ

ตรวจสอบสิ่งนี้สำหรับโครงการ Android FFmpeg ตัวอย่างที่สมบูรณ์ของฉันบน GitHub

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