การสร้างวิดีโอ MP4 พร้อมสำหรับการสตรีม HTTP


25

ฉันจะแปลงsome.flvหรือsome.aviหรือsome.wmvมี FFmpeg เพื่อให้แน่ใจว่าวิดีโอนี้จะสามารถเล่นได้และ seekable ในเจดับบลิว Player?

คำตอบ:


9

นี่คือคำตอบสำหรับความคิดเห็นล่าสุดโดยคุณ @abrahab

คุณไม่จำเป็นต้องmp4boxใช้ไฟล์เพื่อให้สามารถหลอกสตรีมผ่าน nginx ได้ โมดูลการสตรีมมิ่ง MP4 ดูแลโดยไม่คำนึงถึงตำแหน่งของ moov atoms ( mp4boxเลื่อน moov atom ไปที่ตำแหน่งเริ่มต้นของไฟล์)


ตอนนี้สำหรับข้อผิดพลาดเซิร์ฟเวอร์ 500 คุณใช้ตัวเลือก "-frag" กับ mp4box หรือไม่ โมดูลการสตรีม MP4 ไม่สามารถอ่านไฟล์ MP4 ที่กระจัดกระจายได้ การใช้ประโยชน์จากmp4boxการสตรีมหลอกแบบดีคือการสอดแทรกวิดีโอเพื่อการค้นหาที่ดีขึ้น Moov atom shifting เป็นข้อได้เปรียบที่เพิ่มเข้ามา

ฉันทำสิ่งนี้กับmp4boxไฟล์ที่เข้ารหัสด้วย FFmpeg เสมอ

MP4Box -add MyVideo.mp4 -isma Myvideo-box.mp4

สิ่งนี้จะแทรกไฟล์ MP4 เป็น 500 มิลลิวินาทีโดยปริยาย


1
ในการทำไฟล์ "แบบแทนที่" โดยไม่ต้องสร้างไฟล์ใหม่ให้ใช้โดยตรงMP4Box -isma -inter 500 Myvideo.mp4
Vineet

45

H.264 ใน MP4

โดยทั่วไปแล้วคุณต้องการสร้างวิดีโอ x264 ภายในคอนเทนเนอร์ MP4 ตัวเลือกนี้รองรับโดยทั่วไปอุปกรณ์และเบราว์เซอร์ใด ๆ

ต่อไปนี้ควรจะเพียงพอ ตรวจสอบให้แน่ใจว่าได้แทนที่ชื่ออินพุตและตัวเลือก CRF หลังตั้งค่าคุณภาพที่ค่าสติมีตั้งแต่ 19-25 - ต่ำกว่าหมายถึงคุณภาพที่ดีขึ้น แต่ยังบิตเรตที่สูงขึ้น:

ffmpeg -i input.avi -c:v libx264 -crf 23 -c:a aac -movflags faststart output.mp4

คุณยังสามารถใช้Handbrakeเพื่อเข้ารหัสหากคุณชอบวิธี GUI

การใช้faststartตัวเลือก

ตอนนี้สิ่งที่คุณต้องทำคือย้ายอะตอม MOOVของคอนเทนเนอร์ MP4 ไปยังจุดเริ่มต้น อะตอมนี้ (โดยพื้นฐานแล้วหน่วยของข้อมูลในคอนเทนเนอร์ MP4) จะมีข้อมูลเมตาสำคัญเกี่ยวกับสตรีมวิดีโอ / เสียง -movflags faststartควรทำอย่างนั้น

หากเวอร์ชัน FFmpeg ของคุณไม่มีตัวเลือกนี้ให้ลองอัปเกรด หากคุณไม่สามารถอัพเกรดได้คุณสามารถทำสิ่งเดียวกันด้วยเครื่องมือใด ๆ ด้านล่าง:

  • QTIndexSwapperแอปพลิเคชัน Adobe AIR

  • MP4Boxฟรีและโอเพ่นซอร์สเรียกใช้คำสั่งที่คล้ายกับต่อไปนี้ซึ่งคุณสามารถเปลี่ยนช่วงเวลา (ที่นี่ 500)

    mp4box -inter 500 input.mp4

  • qt-faststart ใน Pythonซึ่งทำงานได้ทุกที่ที่ติดตั้ง Python

    qtfaststart input.mp4

เกี่ยวกับมัน.

การควบคุมบิตเรต / คุณภาพ

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

ตัวอย่างเช่นโดยการเพิ่ม-maxrate 2M -bufsize 2Mตัวเลือกการเข้ารหัสคุณ จำกัด การเข้ารหัสไว้ที่ 2 Mbit / s ซึ่งอาจเพียงพอสำหรับวิดีโอความละเอียด 720p บิตเรตที่ต้องการจะขึ้นอยู่กับความซับซ้อนของเนื้อหา การทดลองใช้และข้อผิดพลาดเกิดขึ้น


ขอบคุณฉันทำทุกอย่างเหมือนกัน แต่ดูเหมือนว่าปัญหายังคงอยู่กับวิดีโอ :( ฉันทำffmpeg -i 1.flv -vcodec libx264 -f mp4 -an -g 1 -f mp4 -g 30 -level 3 new.mp4แล้วmp4boxและ mp4 ไม่สามารถค้นหาและรายงาน nginx 500 internal server errorสำหรับพารามิเตอร์เริ่มต้นที่มากขึ้น0เมื่อรหัสวิดีโอไม่มี-vcoded libx264(coder mp4 เริ่มต้น) ไฟล์งานทั้งหมด (แต่ คุณภาพ! sick!) :( (ขออภัยตอนนี้ไม่อนุญาตให้
โหวต

ดูเหมือนว่าปัญหาปลั๊กอิน h.264 กับ NginX ไม่ใช่ปัญหาการแปลงวิดีโอใด ๆ ฉันไม่ใช่ผู้เชี่ยวชาญในการสตรีมวิดีโอผ่านเว็บแต่ฉันเห็นคุณถามแล้วเกี่ยวกับเรื่องนี้ใน Stack Overflow ใช่ไหม stackoverflow.com/questions/11079748/...
slhck

ฉันคิดด้วยว่าบางที nginx ไม่สามารถอ่านรูปแบบวิดีโอนี้ได้อย่างถูกต้อง วิดีโอจาก youtube ก็เล่นได้ดีเช่นกัน ใช่ฉันถูกถามในสแต็คเกี่ยวกับปัญหา nginx แต่ดูเหมือนว่าไม่มีคำตอบ :(
abrahab

3
+1 สำหรับ-movflags faststartสิ่งที่ฉันต้องการ
andrew

ลิงก์นั้นตายแล้วต้องใช้ web.archive.org: web.archive.org/web/20140201142344/http://www.longtailvideo.com/?hl=th
malat

5

คุณสามารถแปลง AVI หรือ MP4 ที่ไม่สามารถสตรีมได้เช่นกันโดยไม่ต้องเข้ารหัสทุกอย่างใหม่โดยทำสิ่งนี้:

ffmpeg -i INPUT.mp4 -c copy -movflags faststart STREAMABLE_OUTPUT.mp4

ไม่จำเป็นต้องเข้ารหัสอะไรอีกเพราะต้องย้าย moov atom


-1

คุณสามารถลองกับ ffmpeg:

ffmpeg.exe -i "INPUT_FILE.AVI" -threads 2 -s 800x600 -r 25.00 -threads 1 -pix_fmt yuv420p -g 300 -qmin 3 -b 2048k -async 1 -acodec pcm_s16le -ar 22050 -ac 1 -ab 128k -y "OUTPUT_FILE.mp4"

5
PCM 22 kHz เสียงสเตอริโอสำหรับวิดีโอสตรีมมิ่งทางอินเทอร์เน็ต? เสียงไม่ได้มีประสิทธิภาพมากเกินไป แล้วทำไมคุณถึงตั้งค่าบิตเรตเสียงเป็น 128k?
slhck

@slhck คุณสามารถเปลี่ยน 22k เป็น 44k แทนที่ "-ar 22050" ด้วย "ar 44100"
Searush

1
@SEARAS ปัญหาไม่ใช่อัตราการสุ่มตัวอย่าง มันเป็นความจริงที่ว่าเสียงนั้นไม่มีการบีบอัด PCM สเตอริโอ สำหรับการสตรีมอินเทอร์เน็ต นั่นไม่ได้คิด
slhck

คำตอบนี้มีคุณภาพต่ำมากและควรลบออก พารามิเตอร์อาจเปลี่ยนแปลงอัตราเฟรมความละเอียดวิดีโอและอัตราการสุ่มตัวอย่างเสียงของเนื้อหาและสร้างผลลัพธ์ที่ไม่มีประสิทธิภาพหรือคุณภาพต่ำ (ffmpeg สามารถเลือกพารามิเตอร์ที่ปลอดภัยหรือดีกว่าได้เอง) ผลการดำเนินงานยังเป็นง่อยโดยข้อ จำกัด หัวข้อน้อยลงและไม่ได้ทำงานร่วมกับ-acodec pcm_s16le(ข้อผิดพลาด: Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument) เหตุผลที่ดีเช่น IETF ฉบับร่างเหตุใดจึงเลือกพารามิเตอร์เหล่านี้ดูเหมือนจะหายไป
LiveWireBT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.