image + audio = mp4: จะทำให้วิดีโอเล็กลงได้อย่างไร


12

ฉันใช้ ffmpeg เพื่อเพิ่ม JPG เป็น MP4 เพื่อสร้าง MP4

มีเพียงภาพเดียวที่ทำให้วิดีโอฉันสงสัยว่ามีวิธีลดขนาดวิดีโอหรือไม่

คำสั่ง:

$ ffmpeg -loop 1 -i image.jpg -i audio.mp3 -shortest -c:a copy output.mp4

ผล:

  • image.jpg = 26.7K (ภาพไม่ชัดเจน)
  • audio.mp3 = 64.6M (54 นาที)
  • output.mp4 = 80.6M (ผลวิดีโอไม่ชัดเจนเพลงยังดีอยู่)

ขนาดเหมาะสมสำหรับ MP4 หรือไม่


ฉันสงสัยว่ามันเป็นไปได้ที่จะ mp4 เมตาเพื่อที่จะเล่น mp3 เท่านั้นและให้หน้าจอคงที่ในหนึ่ง jpg เพื่อประหยัดขนาด :)
SIDU

เครื่องเล่นเป้าหมายอุปกรณ์หรือไซต์สำหรับผลลัพธ์คืออะไร
llogan

ฉันกำลังพยายามอัปโหลด. mp4 ไปยัง Youtube.com
SIDU

คำตอบ:


18

สำหรับการอัพโหลดไปยัง YouTube

H.264: ไฟล์ที่เล็กที่สุด

วิธีนี้ใช้ libx264 เพื่อเข้ารหัสวิดีโอ H.264 ช้ากว่าวิธีการคัดลอกสตรีมด้านล่าง แต่อาจส่งออกไฟล์ขนาดเล็กลง

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 \
-c:v libx264 -preset veryslow -crf 0 -c:a copy -shortest output.mkv

สตรีมการคัดลอก: กระบวนการที่เร็วที่สุด

วิธีนี้เป็นเพียงการสตรีมคัดลอก (ไม่มีการเข้ารหัส) ภาพลงในภาชนะ MKV มันเร็วสุด ๆ แต่ถ้าขนาดสำคัญกว่าวิธีการข้างต้นอาจทำให้ไฟล์เล็กลง

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 -c copy -shortest output.mkv
  • YouTube ยอมรับทุกสิ่งดังนั้นคำสั่งเหล่านี้ใช้เทคนิคเล็กน้อยเพื่อทำให้การเข้ารหัสเร็วขึ้นหรือทำให้ไฟล์มีขนาดเล็กและทำให้มีคุณภาพสูงเนื่องจาก YouTube จะเข้ารหัสสิ่งที่คุณให้ไว้อีกครั้ง ผู้เล่นของคุณอาจจะไม่ชอบ แต่ YouTube จะ

  • ในตัวอย่างเหล่านี้ใช้อัตราเฟรมที่ต่ำมากซึ่งควรประมวลผลเร็วกว่าค่าเริ่มต้นที่ 25 fps


ความเข้ากันได้ที่กว้างที่สุดสำหรับผู้เล่นทุกคน

ffmpeg -loop 1 -i image.png -i music.mp3 -vf "scale='min(1280,iw)':-2,format=yuv420p" \
-c:v libx264 -preset medium -profile:v main -c:a aac -shortest -movflags +faststart output.mp4
  • นี้ควรจะเล่นในเพียงเกี่ยวกับอะไรยกเว้นอุปกรณ์โบราณ (เปลี่ยนแปลง-profile:v mainไป-profile:v baselineถ้าเป็นกรณี)

  • หากอินพุตเสียงของคุณเป็น AAC แล้ว-c:a aacให้เปลี่ยน-c:a copyเป็นหลีกเลี่ยงการเข้ารหัสซ้ำโดยไม่จำเป็น

  • เวลาการเข้ารหัสจะนานขึ้นและขนาดไฟล์จะใหญ่กว่าคำสั่ง YouTube ด้านบน

  • ดูFFmpeg Wiki: H.264สำหรับข้อมูลเพิ่มเติม


คุณสามารถระบุบรรทัดของรหัสเพื่อสร้าง a.jpg + a.mp3 = a.mp4 ใน 1280 * 720 ที่มีเฟรมต่ำสุด / วินาทีที่ YouTube อนุญาตหรือไม่ นอกจากนี้เนื่องจากมีเพียงงานเดียวฉันต้องลบ "-loop 1" หรือไม่ ขอบคุณล่วงหน้า.
SIDU

@SIDU คำสั่งที่มีอยู่ทำตามที่คุณร้องขอ (นอกเหนือจากการแสดงผล MKV แทนที่จะเป็น MP4) แต่ฉันไม่ทราบว่าอัตราเฟรมต่ำสุดที่ YouTube รองรับคืออะไร คุณจะต้องทดสอบ ทำไมคุณต้องใช้ MP4 เมื่อคุณเพิ่งอัพโหลดไปยัง YouTube
llogan

ฉันลองมัน แต่มันบอกว่า:Unrecognized option 'preset'. Error splitting the argument list: Option not found
NineCattoRules

@NineCattoRules ยากที่จะพูดโดยไม่มีข้อมูลเพิ่มเติม ใช้ไซต์ pastebin เพื่อแสดงffmpegคำสั่งแบบเต็มและเอาต์พุตคอนโซลที่สมบูรณ์จากคำสั่งจากนั้นระบุลิงก์ในความคิดเห็น
llogan

ขอบคุณฉันติดตั้ง FFMPEG ใหม่โดยใช้ที่เก็บ mc3man และตอนนี้ทำงานได้ดี!
NineCattoRules

3

มีเพียงข้อมูลที่คุณให้ในสิ่งที่ฉันคิดได้

ไปกันเถอะ:

เนื่องจากมีเพียงหนึ่งภาพที่เพิ่มลงในวิดีโอ ฉันสงสัยว่ามีวิธีการลดขนาดวิดีโอเช่นบังคับให้อัตราบิตต่อวินาที = 1 แทน 28 หรือไม่

เนื่องจากเป็นภาพนิ่งจึงไม่จำเป็นต้องเปลี่ยน อยู่เฉยๆ

สิ่งที่คุณกำลังพูดถึงคือเฟรมต่อวินาที (fps)ไม่ใช่บิตเรต และคุณคิดถูก Beign เพียงหนึ่งภาพนิ่ง 1 fps จะไม่เป็นปัญหา

ขนาดเหมาะสมสำหรับ mp4 หรือไม่ ขนาดภาพมีความสำคัญมากหรือไม่?

ในกรณีนี้ขนาดภาพจะไม่ได้มีน้ำหนักมากเพราะเราจัดการกับภาพนิ่งเพียงภาพเดียว หากเป็นวิดีโอคุณภาพสูงแสดงว่าเป็นปัญหาอื่น

ฉันควรปรับขนาด jpg เป็น 1080 * 720 และทำการตั้งค่าเพิ่มเติมใน ffmpeg เพื่อส่งออกเป็น 720p (การตั้งค่า ffmpeg คืออะไร :)

ความละเอียดที่คุณจะพูดคือ 1280x720

ฉันไม่เห็นจุดใน-loop 1ตัวเลือกที่นี่มันจะช้าลงกระบวนการ คุณใช้-shortestเพราะไฟล์มีมากกว่า 1 สตรีมเข้าหรือไม่ ถ้าไม่มีก็ไม่มีเหตุผลที่จะใช้ เมื่อคุณใช้-acodec copyฉันจะต้องสมมติว่าคุณไม่ต้องการเข้ารหัสอีกครั้ง

สำหรับเอาต์พุตที่ 720p 1fps โดยไม่มีการเข้ารหัสซ้ำและไม่สัมผัสบิตเรต:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 output.mp4

ให้ระบุกรณีที่มีอินพุตมากกว่าหนึ่งสตรีมและคุณต้องการให้ ffmpeg เสร็จสิ้นการเข้ารหัสที่สตรีมที่สั้นที่สุดแล้ว:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 -shortest output.mp4

ตอนนี้ถ้าคุณต้องเปลี่ยนบิตเรต (สมมติว่า 1024k เป็นตัวอย่าง);

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -b:v 1024k -bufsize 1024k -s 1280x720 output.mp4

โปรดดู: จำกัด บิตเรตเอาต์พุต

-c: a copy = คัดลอกสตรีมเสียงอินพุตดังนั้นเราจึงไม่เข้ารหัสอีกครั้ง

-b: v = บิตเรตที่ระบุเป็นค่าคงที่ (ไม่แม่นยำ)

-bufsize = เป็นช่วงเวลาที่คำนวณบิตเรตเฉลี่ย ความหมายของภาพต่ำสุดที่มีคุณภาพมากขึ้นสูญเสีย แต่บิตเรตที่ถูกต้องมากขึ้นตามที่ระบุไว้ใน-b:วี

-s = ขนาดที่แท้จริงของเอาท์พุทวิดีโอ

-framerate = อัตราเฟรมอินพุตที่เราต้องการให้เอาต์พุตใช้

โปรดทราบว่าหากคุณยังต้องการวิดีโอขนาดเล็กลง ณ จุดหนึ่งคุณจะต้องเสียสละคุณภาพเพื่อให้บรรลุผลนั้น และวิธีอื่น ๆ ที่เกี่ยวข้องกับการเข้ารหัสซ้ำกับการบีบอัดแบบ lossy

จากสิ่งที่คุณพูดข้อมูลที่คุณให้และสิ่งที่คุณพยายามทำฉันคิดว่าดูเหมือนว่าเป้าหมายของคุณคือการฝังปกอัลบั้มเป็น mp3 หากนั่นคือเป้าหมายของคุณสิ่งนี้จะตรงกับความต้องการของคุณดีกว่า:

ffmpeg -i input.mp3 -i cover.jpg -map_metadata 0 -map 0 -map 1 output.mp3

-map_metadata = ตัวระบุเมทาดาทา ffmpeg ไปยังไฟล์เอาต์พุตจาก infile ในกรณีนี้ ( ศูนย์ ) ข้อมูลเมตาส่วนกลาง

-map 0 = อินพุตสตรีม 1 (เสียง)

-map 1 = อินพุตสตรีม 2 (รูปภาพ)

หากไม่มีสิ่งใดตรงกับคำขอของคุณโปรดให้ข้อมูลเพิ่มเติม


พิจารณาใช้-framerateเป็นตัวเลือกอินพุตและเอาท์พุท-r: มิฉะนั้น framerate ป้อนข้อมูลเริ่มต้นที่ 25 จะถูกใช้และจากนั้นจะลดลงเฟรมเพื่อให้บรรลุffmpeg -r 1หากคุณเพิ่งประกาศอัตราเฟรมอินพุตเอาต์พุตจะใช้อัตราเฟรมเดียวกัน
34470 llogan

ขอบคุณ ไม่ทราบว่า แก้ไขเพื่อให้สอดคล้องกับการเปลี่ยนแปลงที่แนะนำ
Fenrir

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