FFMPEG แปลง flv เป็น mp4 โดยไม่เสียคุณภาพ [ซ้ำ]


55

คำถามนี้มีคำตอบอยู่ที่นี่แล้ว:

ขณะนี้ฉันกำลังแปลง. flv ไฟล์ Flash เป็น. webm และ. mp4 ไฟล์ที่จะใช้กับโปรแกรมเล่นวิดีโอ HTML5

_

ฉันใช้คำสั่ง ffmpeg นี้สำหรับ WEBM: ffmpeg -i filename.flv -vcodec libvpx -acodec libvorbis filename.webm ซึ่งใช้งานได้ดีและขนาดไฟล์ยังคงเหมือนเดิม (สำคัญ)

_

สำหรับ MP4 ฉันใช้สิ่งต่อไปนี้: ffmpeg -i filename.flv -sameq -ar 22050 filename.mp4

มันจะแปลงเป็น. mp4 และช่วยป้องกันการสูญเสียคุณภาพ แต่ขนาดไฟล์เกือบจะเพิ่มขึ้นเป็นสามเท่า

สูตร ffmpeg ใดบ้างที่สามารถใช้แปลงเป็น MP4 ได้โดยไม่สูญเสียคุณภาพมากเกินไปและป้องกันขนาดไฟล์ที่สูงขึ้น?

คำตอบ:


57
ffmpeg -i filename.flv -c:v libx264 -crf 19 -strict experimental filename.mp4

คุณต้องระบุตัวแปลงสัญญาณวิดีโอที่ใช้ ในคำสั่งของคุณคุณไม่ได้ระบุ-vcodecหรือ-c:vดังนั้น ffmpeg ใช้ตัวแปลงสัญญาณเริ่มต้นสำหรับ MP4 ( mpeg4) ซึ่งไม่มีประสิทธิภาพการบีบอัดที่ดีมาก ลองใช้ libx264 แทนและตั้งค่า CRF ซึ่งเป็นระดับคุณภาพ (ต่ำกว่าดีกว่าค่าเริ่มต้นคือ 23 และค่าสติอยู่ระหว่าง 18 และ 28)

การเข้ารหัสด้วย libx264 เป็นชนิดที่ซับซ้อนดังนั้นคุณควรมองขึ้นคู่มือการเข้ารหัส H.264

คุณต้องระบุ-strict experimentalมิฉะนั้นคุณอาจได้รับ: "ตัวเข้ารหัส 'aac' เป็นการทดลอง แต่ไม่ได้เปิดใช้งานตัวแปลงสัญญาณทดลองให้เพิ่ม '-strict -2' หากคุณต้องการใช้"


1
มันใช้เวลานานมากและ mp4 ที่เกิดขึ้นนั้นผิดเพี้ยนพิกเซลหายไป ฯลฯ ความคิดใดที่เป็นเช่นนั้น : /
trainoasis

ตัวแปลงสัญญาณวิดีโอเริ่มต้นสำหรับรูปแบบ MP4 mpeg4ไม่จำเป็นต้องเป็น ตามผลลัพธ์ของffmpeg --help muxer=mp4เครื่องของฉัน ffmpeg ใช้ h264 เป็นตัวแปลงสัญญาณวิดีโอเริ่มต้นของ mp4
doubleDown

1
@doubleDown คำตอบของฉันเก่า - จาก 2011 พวกเขาอาจเปลี่ยนค่าเริ่มต้นในบางจุดตั้งแต่นั้นมา
sashoalm

43

คำสั่งนี้เปลี่ยนคอนเทนเนอร์โดยไม่ต้องเข้ารหัสซ้ำ

ffmpeg -i input.flv -codec copy output.mp4

คุณจะรู้วิธีสร้างสคริปต์สำหรับการแปลงวิดีโอหลายชุดในโฟลเดอร์เดียวกันได้หรือไม่?
ttoine

ใช่บน windows สร้างไฟล์ convert.bat และใส่รหัสนี้ในนั้น: for %%a in ("*.flv") do ffmpeg -i "%%a" -codec copy "%%~na.mp4"จากนั้นดำเนินการ convert.bat ในโฟลเดอร์ที่มีไฟล์ * .flv
c97

1
สำหรับฉันแล้วการโยนนี้ไม่สามารถเขียนส่วนหัวสำหรับไฟล์เอาต์พุต # 0 (พารามิเตอร์ตัวแปลงสัญญาณไม่ถูกต้องหรือไม่): อาร์กิวเมนต์ไม่ถูกต้อง ความคิดใด ๆ : /
trainoasis

2
@trainoasis .flv ของคุณไม่มีวิดีโอ H.264 และเสียง AAC การคัดลอกข้อมูลเสียง / วิดีโอแตะต้องกับ-codec copyไปยังแฟ้ม .mp4 ใช้งานได้เฉพาะในกรณีที่หายากมากที่เสียงและวิดีโอแล้วเข้ารหัสด้วย H.264 และ AAC ดูsuperuser.com/a/1009539/390946และaddpipe.com/blog/flv-to-mp4
Octavian Naicu

3

avconvและffmpegเป็นสิ่งเดียวกัน [ณ เร็ว ๆ นี้มีความแตกต่างบางอย่าง แต่ไม่มากนักที่จะเขียนถึงบ้านถ้าคุณคอมไพล์ของคุณเองffmpeg[อันที่ให้ไว้ใน Ubuntu repos เช่นอินสแตนซ์เก่าและทนทุกข์ทรมานจากขนาดวิดีโอนั้นไม่ใช่ blah blah blah deal [โดยทั่วไปพยายาม เพื่อบอกให้คุณทราบว่าวิดีโอมีสัดส่วนที่ไม่ถูกต้อง] แต่ถ้าคุณรำคาญที่จะอ่านffmpegคู่มือการคอมไพล์และรวบรวมจากคอมไพล์มันไม่มีปัญหาของเวอร์ชั่นเก่าที่มีอยู่ในระบบปฏิบัติการส่วนใหญ่ เตือนค่าเสื่อมราคาหมายถึงavconvจะบอกคุณว่าพวกเขาได้สร้าง util ใหม่ที่จะลองและแทนที่ffmpegแต่มันเป็นSOอย่างกว้างขวางใช้ว่าแม้ว่าพวกเขาพยายามที่จะตัดมันออกไปเราทุกคนจะได้สร้าง Softlinks จากavconvไปffmpeg ยังไงก็ตามพวกเขาจะไม่หยุดทำงานและวางมันลง]]

มันไม่ใช่เรื่องเลวร้ายที่จะใช้avconvฉันเพิ่งเห็นคำตอบเดียวที่กล่าวถึงคำเตือนค่าเสื่อมราคาซึ่งเป็นข้อความว่างเปล่าควรเป็นทางเลือกสำหรับ ffpmeg มากกว่าที่คุณสามารถลองใช้ avconv ซึ่งเป็นจริงมากกว่าในกรณีนี้

avconv -i inputfile.flv -map 0 -c:v libx264 -c:a copy outputfile.mp4

เป็นชื่อเดียวกันว่า

ffmpeg -i filename.flv -vcodec libvpx -acodec libvorbis

เป็นหลักในครั้งแรกที่คุณใช้ตัวเลือกที่สั้นกว่าและในครั้งที่สองคือความหลากหลายที่เขียนออกมามากขึ้น

ALSO -map 0หมายถึงแทร็กเสียงดังนั้นหากใช้บางอย่างเช่นmp4aที่สามารถจัดการแทร็กเสียงหลายแทร็กได้ดีคุณสามารถปล่อยให้มันปิดเพื่อคัดลอกสตรีมเสียงทั้งหมดไปยังไฟล์ผลลัพธ์ นี่เป็นสิ่งจำเป็นเท่านั้นหากใช้ตัวแปลงสัญญาณที่ไม่รองรับแทร็กเสียงหลายไฟล์ในไฟล์เดียวกันคุณจะต้องแมปเสียงที่ต้องการไม่ใช่ทั้งหมด แน่นอนว่าถ้าพยายามลดพื้นที่ที่ใช้ให้น้อยที่สุดคุณสามารถระบุได้เพียงหนึ่งไฟล์เพื่อลองและทำให้ไฟล์มีขนาดเล็กลงเล็กน้อย [เสียงเหมือนขนาดของแทร็กวิดีโอที่ 1/3

-c:v = codec(video)ดังนั้น: -c:v libx264เหมือนกับการใช้: -vcodec libx264FYI; เหมือนกับตัวอย่างนี้:-c:v copy = -vcodec copy

และยิ่งกว่านั้นสำหรับ FLV โปรดใช้ความระมัดระวังว่าไฟล์ flv นั้นเหมือนกับ avi เพราะมันคือคอนเทนเนอร์ซึ่งสามารถมีตัวแปลงสัญญาณจำนวนเท่าใดก็ได้สำหรับวิดีโอหรือเสียง คุณต้องการใช้ยูทิลิตีการตรวจสอบสื่อที่คุณต้องการก่อนเพื่อดูว่ามีการใช้งานอะไรภายในไฟล์ก่อนที่คุณจะเลือกเพียงคัดลอกวิดีโอและ / หรือออดิโอสตรีมหรือถ้าคุณต้องการส่งมันจากอะไรก็ตาม ดังนั้นคำสั่งที่ใช้งานได้ดีที่สุดสำหรับ FLV หนึ่งเครื่องอาจไม่เหมือนกันสำหรับ FLV อื่น [แน่นอนโดยทั่วไปหากได้รับ FLV หลายรายการจากแหล่งเดียวกันพวกเขาจะถูกเข้ารหัสด้วยวิธีเดียวกัน แต่ไม่รับประกันเลย]

ไม่พยายามที่จะรับเลือกเพียงแค่วิ่งข้ามสิ่งนี้ในการค้นหาเว็บและต้องการที่จะพยายามช่วยชี้แจงสิ่งต่าง ๆ สำหรับคนเล็กน้อย

อีกครั้งเนื่องจากคำตอบนี้ระบุไว้สำหรับคำตอบด้านล่างนี้ YES ที่ทำงานอยู่ ffmpeg จะโพสต์ข้อความนั้นโดยทั่วไปแล้วมันจะกลวงโดยที่ 2 utils เหล่านี้ยังคงใช้ประโยชน์เดียวกันกับความแตกต่างน้อยมาก ในกรณีส่วนใหญ่คุณควรได้ผลลัพธ์เดียวกันโดยใช้ทั้งคำสั่ง สิ่งนี้ไม่จำเป็นต้องส่งผลให้เกิดการเปลี่ยนรหัสใหม่ทำไม? ตอบหากไม่จำเป็นจะช่วยประหยัดเวลาได้มากและ B หากคุณแปลงรหัสไฟล์ที่บีบอัดไว้ในตัวแปลงสัญญาณวิดีโอแล้วคุณกำลังเรียกใช้รูทีนการบีบอัดกับสิ่งที่ถูกบีบอัดแล้วและจะส่งผลเสมอ คุณภาพต่ำกว่าแหล่งที่มา ตัวแปลงสัญญาณที่ใหม่กว่าส่วนใหญ่นั้นสามารถใช้งานร่วมกันได้เช่นไม่ใช่ flv ซึ่งสามารถเป็น MP4 ภายใน wrapper FLV เนื่องจาก FLVs เช่น AVIs เป็นเพียงคอนเทนเนอร์ของตัวแปลงสัญญาณอื่น ๆ ดังนั้น, มันขึ้นอยู่กับแหล่งที่มาของไฟล์ flv สำหรับวิดีโอและตัวแปลงสัญญาณ ausio เปรียบเทียบกับสิ่งที่คุณแปลงไปเพื่อดูว่าจำเป็นต้องแปลงรหัสหรือไม่ หากภายใน FLV พวกเขาใช้วิดีโอ H264 MP4 และ MP4a สำหรับเสียงคุณไม่จำเป็นต้องแปลงรหัสอีกครั้งสิ่งที่คุณจะต้องคัดลอกออกและปรับส่วนหัวของไฟล์เพื่อให้อ่านเป็น MP4 จริงแทนที่จะเป็นวิดีโอ MP4 ข้างในไฟล์ FLV


3

ตามคำแนะนำนี้คำสั่งที่เหมาะสมในการแปลง FLV เป็น MP4 โดยไม่มีการบันทึก AV คือ:

ffmpeg -i input.flv -c copy -copyts output.mp4

มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉันในทุกกรณีด้วยวิดีโอ AVC และ AAC หรือ MP3


-1

เมื่อใช้ ffmpeg ฉันได้รับคำเตือนเรื่องเลิกใช้ avconv ใช้ avconv ฉันได้ผลลัพธ์ที่ดี:

avconv -i inputfile.flv -map 0 -c: v libx264 -c: สำเนาผลลัพธ์ outputfile.mp4

อ่านman avconvข้อมูลเพิ่มเติม


1
ffmpegตัวเองไม่ได้เลิก เหตุผลที่ดูดีคือคุณระบุตัวเข้ารหัส x264 ซึ่งมีการตั้งค่าเริ่มต้นที่ดีสำหรับคุณภาพ
slhck

-2

ฉันขอแนะนำให้คุณสร้างเชลล์สคริปต์สำหรับสิ่งที่เรียกvideo_flv_to_mp4ด้วยเนื้อหาดังต่อไปนี้:

ffmpeg -i $1 -sameq -ar 22050 -vcodec libx264 $1.mp4 

จากนั้นเรียกใช้ดังนี้:

$ video_flv_to_mp4 video.flv

มันจะให้ไฟล์ video.flv.mp4 แก่คุณ


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