ffmpeg: บรรจุภัณฑ์ H264 @ MPEGTS ลงใน Smooth Streaming


0

ฉันมีชุดไฟล์ (ค่อนข้างใหญ่) นั่นคือทั้งหมด H264 ใน MPEG TS ภาชนะ เนื่องจากข้อ จำกัด ด้านเวลาฉันจำเป็นต้องบรรจุเนื้อหาใหม่ลงในการสตรีมที่ราบรื่นโดยไม่ต้องแปลงรหัส (การแปลงรหัสจะใช้เวลานานเกินไป)

ฉันได้พยายามหาวิธีการทำเช่นนี้กับ ffmpeg เนื่องจากดูเหมือนว่ามี muxers ที่แตกต่างกัน 2 ตัวที่อาจใช้งานได้ ฉันได้ลองทั้ง muxer 'smoothstreaming' และ 'ismv' muxer แต่ด้วยทั้งคู่ฉันกำลังเจอปัญหา

ffmpeg -i input.mpg -codec copy -f smoothstreaming ss_out

ด้วยสิ่งนี้ฉันได้รับข้อผิดพลาดต่อไปนี้:

ffmpeg version N-79695-g675cfb2 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.3.1 (Debian 5.3.1-14) 20160409
  configuration: 
  libavutil      55. 23.100 / 55. 23.100
  libavcodec     57. 38.100 / 57. 38.100
  libavformat    57. 35.100 / 57. 35.100
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 44.100 /  6. 44.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  0.101 /  2.  0.101
Input #0, mpegts, from 'input.mpg':
  Duration: 01:28:41.98, start: 2.040000, bitrate: 2500 kb/s
  Program 1 
    Stream #0:0[0x1e1]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p, 720x576 [SAR 16:11 DAR 20:11], 25 fps, 25 tbr, 90k tbn
    Stream #0:1[0x1e2](eng): Audio: mp2 ([4][0][0][0] / 0x0004), 48000 Hz, stereo, s16p, 192 kb/s
[smoothstreaming @ 0x2616340] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
    Last message repeated 1 times
[smoothstreaming @ 0x2616340] No bit rate set for stream 0
Output #0, smoothstreaming, to 'ss_out':
  Metadata:
    encoder         : Lavf57.35.100
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 720x576 [SAR 16:11 DAR 20:11], q=2-31, 25 fps, 25 tbr, 50 tbn
    Stream #0:1(eng): Audio: mp2 (i[0][0][0] / 0x0069), 48000 Hz, stereo, 192 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument

อีกสิ่งที่ฉันลองคือบรรจุด้วย ffmpeg ใน ismv:

ffmpeg -i input.mpg -c copy -movflags isml+frag_keyframe -f ismv ss_out.ismv

มันใช้งานได้ดี แต่ฉันต้องการเครื่องมือ ismindex เพื่อสร้างไฟล์ manifest แต่มันล้มเหลว:

ismindex -n ss_out ss_out.ismv

Unable to read the MFRA atom in ss_out.ismv (mfra size mismatch)

มีบางอย่างที่ฉันทำผิดหรืออาจจะมีบางอย่างผิดปกติกับไฟล์อินพุตของฉัน


เสียงของคุณคือ MP2 ISMV ดูเหมือนจะยอมรับ AAC-LC หรือ WMA Pro ดังนั้นลองเข้ารหัสเสียงไปที่ AAC
Gyan

ขอบคุณสำหรับเคล็ดลับนั้น ฉันคิดว่าอาจเป็นสาเหตุของปัญหาของฉัน (ถ้าไม่ใช่ทั้งหมด) ฉันยังไม่ได้ทดสอบไฟล์ของฉัน แต่ตอนนี้ฉันใช้ ismv muxer ในขณะเดียวกันการเข้ารหัสเสียงไปยัง aac ฉันยังลบ 'isml' ออกจาก movflags ดูเหมือนว่าไม่จำเป็นสำหรับเนื้อหาที่ไม่ใช่สด (อาจเป็นปัญหาที่ฉันเดา) ffmpeg -i input.mpg -c:v copy -c:a aac -b:a 192k -movflags frag_keyframe -f ismv ss_out.ismv หลังจาก ismindex นี้จะทำงานได้ดี!
Sartsj

BTW, muxer 'smoothstreaming' ใช้ 'ismv' เป็นอินพุตเท่านั้นหรือมีบางอย่างผิดปกติกับไฟล์อินพุต MPEGTS ของฉัน หลังจากบรรจุภัณฑ์ให้กับ ISMV ก่อนจากนั้นใช้ muxer 'smoothstreaming' ซึ่งทำงานได้เช่นกัน อย่างไรก็ตามฉันไม่เคยตระหนักถึงผลลัพธ์ของสิ่งนั้นว่าเป็นชิ้นส่วนและรายการที่เกิดขึ้นจริง (สิ่งที่เว็บเซิร์ฟเวอร์ทำตามปกติด้วยการสตรีมที่ราบรื่น) ฉันต้องการชุดของไฟล์ ism / ismc / ismv ซึ่งไม่ได้สร้าง
Sartsj

คำตอบ:


0

ดังนั้นจากวิธีแก้ปัญหาที่เป็นไปได้ 2 อย่างที่ฉันคิดว่าฉันมีในคำถามของฉันทั้งสองสามารถทำงานได้ แต่พวกเขามีผลลัพธ์ที่แตกต่างกัน

ISMV muxer + ismindex

สิ่งที่ฉันต้องการคือชุดของไฟล์ฝั่งเซิร์ฟเวอร์ (.ism, .ismc, .ismv) เพื่อให้บรรลุเป้าหมายนี้ฉันขอทำ 2 สิ่งต่อไปนี้:

ffmpeg -i input.mpg -c:v copy -c:a aac -b:a 192k -movflags frag_keyframe -f ismv ss_out.ismv

คำสั่งดังกล่าวคัดลอกสตรีมวิดีโอโดยไม่ต้องแปลงรหัสแปลงสัญญาณเสียงลงใน AAC (แม้ว่ามันจะดูเหมือน ffmpeg และ ismindex ทั้งคู่ก็ไม่สนใจเสียง MP2 เช่นกัน) และบรรจุลงใน .ismv

ismindex -n ss_out ss_out.ismv

เครื่องมือ ismindex สามารถสร้างไฟล์. ism และ. ism ที่ฉันต้องการ

ไฟล์ที่ฉันได้รับจากสิ่งนี้สามารถสตรีมผ่าน IIS ด้วย Media Services

สตรีมมิ่ง Smooth Smooth

ฉันยังมี muxer 'smoothstreaming' ให้ใช้งานได้ในตอนท้ายเคล็ดลับคือต้องใช้ไฟล์. ism เป็นอินพุตเช่นกัน ดังนั้นฉันจึงรันคำสั่ง ffmpeg เช่นเดียวกับข้างบนก่อนหลังจากนั้นฉันสามารถใช้ ffmpeg อีกครั้งเพื่อทำการบรรจุใหม่ด้วย muxer 'smoothstreaming'

แต่ปัญหาที่ฉันได้รับจากวิธีนี้คือมันส่งผลให้ไฟล์ที่จำเป็นสำหรับเว็บเซิร์ฟเวอร์ทั่วไปในการสตรีมที่ราบรื่น ดังนั้นจึงมีการแยกส่วนวิดีโอและเมตาดาต้าต่ออัน ซึ่งจัดการโดยปกติทั้งหมดโดยเซิร์ฟเวอร์การสตรีม

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