การระบุพารามิเตอร์เพื่อสร้างวิดีโอสำหรับ dematec concat ของ ffmpeg (เพื่อหลีกเลี่ยงการเข้ารหัสขนาดใหญ่อีกครั้ง)


2

ffmpegสามารถใช้เชื่อมไฟล์เข้าด้วยกัน :

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

(เน้นที่เหมือง)เจตนาของฉัน1คือผลิตไฟล์สื่อที่มีตัวแปลงสัญญาณและพารามิเตอร์เดียวกันเพื่อให้ฉันสามารถใช้ประโยชน์จาก concat ได้โดยไม่ต้องเข้ารหัสซ้ำอีกต่อไป

บทนำ:

ฉันมีไฟล์ที่ฉันต้องการตัดและเก็บส่วนที่มีประโยชน์ไว้ ฉันได้เขียนสคริปต์ไพ ธ อนเพื่อค้นหาคีย์เฟรมที่ใกล้ที่สุดไปยังจุดตัดที่ต้องการและตัดตรงนั้นเนื่องจากเมื่อทำการคัดลอกสตรีม ffmpeg สามารถใช้ I-frames ได้เท่านั้น:

การใช้ -ss เป็นตัวเลือกอินพุตพร้อมกับสำเนา -c: v อาจไม่ถูกต้องเนื่องจาก ffmpeg ถูกบังคับให้ใช้ / แยกใน i-frames เท่านั้น

มันเกิดขึ้นแยกไม่ได้เกิดขึ้นที่ว่าช่วงเวลาที่เหมาะสม แต่ใกล้พอสำหรับช่วงเวลาที่ผมสามารถมุ่งเน้นในส่วนของสมการอื่น ถ้าฉันใช้concatdemuxer ณ จุดนี้ส่วนต่าง ๆ เข้าด้วยกันอย่างสมบูรณ์ - ดีมาก!

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

แผนภาพพื้นฐานน่าจะช่วยอธิบายสิ่งนี้ได้:

  [111AAAA111BBBBB111111CCCCCCC1111DDDDD111]   | (original file)
     [AAAA] [BBBBB]    [CCCCCCC]  [DDDDD]      | (desired clips extracted)
[AAA] [A][B] [BBB] [B][C] [CCCCC] [C][D] [DDDD]| (split ends from clips)
      [AAA][ab][BBB][bc][CCCCC][cd][DDD]       | (transitions between short ends)
            [AAAabBBBbcCCCCCcdDDD]             | (intended output)

ปัญหา:

ที่นี่ฉันได้ไป เมื่อฉันใช้ffmpeg's concatdemuxer ที่จะเข้าร่วมคลิปดังกล่าวข้างต้นที่ฉันได้รับภาพและเสียงสิ่งประดิษฐ์อย่างมีนัยสำคัญในการเล่น ฉันเดาว่ามีความไม่ตรงกันในพารามิเตอร์ตัวแปลงสัญญาณตามที่ระบุไว้เป็นวิธีที่จำเป็นขึ้นไปด้านบนของคำถามนี้ ดังนั้นการตรวจสอบวิดีโอด้วยการffprobeให้:

$ ffprobe -i ab-transition.mkv 2>&1 | grep Stream.*Video ; ffprobe -i B.mkv 2>&1 | grep Stream.*Video
Stream #0:0: Video: h264 (Main), yuv420p(tv, bt709/bt709/iec61966-2-1), 1280x720, SAR 1:1 DAR 16:9, 62.50 fps, 62.50 tbr, 1k tbn, 120 tbc (default)
Stream #0:0: Video: h264 (Main), yuv420p(tv, bt709/bt709/iec61966-2-1), 1280x720 [SAR 1:1 DAR 16:9], 62.50 fps, 62.50 tbr, 1k tbn, 125 tbc (default)

(ฉันได้ข้ามเอาท์พุทสตรีมเสียงเป็นสตรีมที่มีพารามิเตอร์เดียวกันอย่างเห็นได้ชัด แต่เสียงเข้าร่วมไม่ถูกต้อง)

มีความแตกต่าง ฉันใช้-show_streamsเพื่อรับข้อมูลรายละเอียดเพิ่มเติมซึ่งมีอยู่ที่http://pastebin.com/4vcnDYtj (บรรทัดว่างเดี่ยวแยก 2 เอาต์พุต) diffไอเอ็นจีเอาท์พุทให้:

7c7
< codec_time_base=1/120
---
> codec_time_base=1/125
70,71c70,71
< start_pts=12
< start_time=0.012000
---
> start_pts=11
> start_time=0.011000

ปรับปรุง:

ฉันพบตัวเลือกและพารามิเตอร์ที่ตรงกันสำหรับทุกสิ่งที่ฉันเห็นยกเว้นฐานเวลาตัวแปลงสัญญาณ (tbc) มีการตั้งค่าที่จะให้ฉันตั้ง codec_time_base (tbc)หรือไม่ การตั้งค่า-rไม่มีผล

อัปเดต 2:ความกลัวคำถามนี้มีความเฉพาะเจาะจงสำหรับ SU มากเกินไปฉันถามคำถามของรายชื่อผู้รับจดหมาย ffmpeg- น่าเสียดาย-time_baseที่ตัวเลือกการเข้ารหัสไม่เหมาะสมในกรณีนี้:

นี่เป็นตัวเลือกสำหรับตัวเข้ารหัส FFmpeg- ภายในที่คุณพยายามใช้สำหรับตัวเข้ารหัสภายนอก (x264)

และน่าเสียดายที่เมื่อฉันถามถึงความเป็นไปได้ทั่วไปคำตอบก็คือ

ฉันไม่คิดว่ามันเป็นไปได้

ฉันได้ขอคำชี้แจงและความเป็นไปได้โดยรอบซอฟต์แวร์การเข้ารหัสดั้งเดิม - ในกรณีนี้OBS- ซึ่งอาจมีความยืดหยุ่นน้อยกว่าในตัวเลือกข้อมูลจำเพาะมากกว่าffmpegเนื่องจากต้องตรงกับข้อกำหนดรูปแบบสดของผู้บริโภคสตรีม (Twitch) ฉันยังไม่ได้รับการตอบกลับจากรายชื่อผู้รับจดหมาย แต่ได้ถามในฟอรัม OBS ด้วยเช่นกัน

ยิ่งไปกว่านั้นการควบคุมสำหรับสิ่งเหล่านี้ทำให้ฉันสามารถใช้concatdemuxer ffmpegเพื่อเข้าร่วมสิ่งเหล่านี้ด้วยกันโดยไม่ต้องใช้กระบวนการเข้ารหัสแบบยาว ? ขอบคุณมากล่วงหน้า

(ฉันตระหนักว่านี่เป็นข้อความที่มีผนังและครึ่งดังนั้นการเพิ่มเติมการลบหรือคำแนะนำในการชี้แจงยินดีต้อนรับแน่นอนฉันจะเชื่อมโยงไปยังข้อมูลที่เป็นทางการมากขึ้น แต่เป็น <10 ตัวแทนฉันไม่สามารถรวมมากกว่า 2 ลิงค์! )


1 : สำหรับบริบทเพิ่มเติมให้ดูคำถามที่เกี่ยวข้องของฉัน: จะเข้าร่วมวิดีโอคลิปได้อย่างมีประสิทธิภาพและอัตโนมัติโดยใช้ช่วงการเปลี่ยนภาพสั้น ๆ อย่างไร


1
ยังไม่ยอมแพ้ในเรื่องนี้ ;-) ฉันรู้ว่าสิ่งนี้ขัดต่อความตั้งใจของคุณ แต่คุณได้ลองดำเนินการ concat ครั้งสุดท้ายกับ encoders แทนที่จะเป็นตัวแปลงสัญญาณ codec เพื่อดูว่ามันกำจัด a / v หรือไม่? อย่างน้อยที่สุดคุณช่วยโพสต์คำสั่ง ffmpeg แบบเต็มที่คุณใช้เพื่อสร้างคลิปและช่วงการเปลี่ยนภาพของคุณได้หรือไม่?
นายอะไร

@ Mr.What ดีใจที่ได้ยิน - ฉันถามคำถามไปทั่วแล้ว (ตามการอัพเดท) การใช้ตัวเลือกโคเดกจะทำให้เกิดการแปลงรหัสสุดท้าย แต่ควรกำจัดสิ่งประดิษฐ์ตามที่คุณพูด ฉันค่อนข้างแน่ใจว่าฉันทดสอบสิ่งนี้ในหลายชั่วโมงที่ฉันใช้ไป! ฉันสามารถโพสต์คำสั่งได้อย่างแน่นอน แต่ช่วงการเปลี่ยนภาพจะถูกสร้างขึ้นผ่านการละลาย (MLT) ตามคำถามอื่น ๆ (ที่เชื่อมโยง) ของฉัน ไม่มีใครที่ฉันถามดูเหมือนว่าจะสามารถปรับเปลี่ยนระยะเวลา; แม้ว่าฉันจะจัดการมันจากด้านแหล่งที่มา (OBS) ตัวเลือก x264 -time_base จะถูกละเว้น!
bertieb

1
ขุดลึกลงไปในเอกสารมีsettbตัวกรองซึ่งอาจจะมีมูลค่าพยายามเพราะมันจะถูกนำไปใช้นอกเข้ารหัส x264 ffmpeg input.ext -vf "settb=expr=1/125" -c:v libx264, etc. output.ext- หรือมีการกล่าวถึง / ลองใช้ในการเดินทางของคุณแล้วหรือยัง?
นายอะไร

@ Mr.What ตัวกรองนั้นดูมีแนวโน้ม แต่การแปลงไฟล์ด้วย timebase 125 ไม่สามารถสร้างฐานเวลาที่ต้องการ 120 (หรืออื่น ๆ ) ถึงแม้ว่ามันจะบ่นอย่างมากเกี่ยวกับ"ระยะเวลาที่ผ่านมา 0.874992 (ฯลฯ ) มีขนาดใหญ่เกินไป" : - / คิดดี แต่! พล็อตมีความหนามากขึ้นเช่นเดียวกับการนับด้วยมือไฟล์ต้นฉบับดูเหมือนจะมี 60 เฟรมต่อวินาทีเมื่อเล่น (ไม่ใช่ 62-63) ไม่แน่ใจว่าเป็นเพราะฐานเวลาทำให้ผู้เล่นข้ามเฟรมไปหรือไม่ ลงลึกไปในโพรงกระต่ายที่นี่!
bertieb

เอฟเฟ็กต์ลูกและคริกเก็ตแปลก ๆ อยู่ในแนวเดียวกันกับตัวแปลงสัญญาณคัดลอกไปยังเอาต์พุตสำหรับคลิปที่ไม่ใช่การนำส่งของคุณดังนั้นจึงไม่แปลกใจเลยที่มี ฉันสงสัยว่าการรวม-copyinkf(ซึ่งจะรวมเฟรมที่ไม่ใช่คีย์หลักใน-c copyเอาต์พุต) อาจช่วยในการวางตลาดครั้งสุดท้ายและถ้ามันคุ้มค่าที่จะบังคับให้คลิปการเปลี่ยนผ่านที่เข้ารหัสผ่านที่มีเหตุผลเข้าหาlibx264กัน เช่นเดียวกับการทดลองลองสร้างคลิป "a" และ "b" ของคุณใหม่โดยใช้-copyinkf -c:v copy -c:a copyทรานส์ ใช้คลิปlibx264 -r 60แล้วต่อสามตัวนั้นเข้าด้วยกันแล้วดูว่ามีความแตกต่างหรือไม่
นายอะไร

คำตอบ:


2

ตามตัวเลือก codec ทั่วไปคุณสามารถเพิ่ม-time_baseชุดเข้ารหัส libx264 ในระหว่างการสร้างคลิปการเปลี่ยนผ่าน

ถ้าฉันอ่านการเปรียบเทียบไฟล์ของคุณอย่างถูกต้อง - ab-transition.mkvแสดง tcb เป็น 1/120 ในขณะที่B.mkvแสดง 1/125 (ซึ่งเป็นค่าที่คุณต้องการใช่ไหม?) - ฉันขอแนะนำ รวมถึง-rค่าที่จะทำให้แน่ใจว่าทั้งเฟรม framerate และเวลาจะได้รับการดูแล:

-c:v libx264 [preset & crf/qp settings] -r 62.50 -time_base 1/125 [output]

ในฐานะที่เป็นหมายเหตุด้านข้างฉันอยากจะพูดถึงความพยายามของฉันในการใช้ concat demuxer โดยไม่ต้องเข้ารหัสไฟล์เอาต์พุตทั้งหมดทำให้เกิดปัญหาซิงค์เสียงส่วนใหญ่และเฟรมลดลง ผลลัพธ์ที่ดีที่สุดได้มาจากการเข้ารหัสคลิปแยกต่างหากด้วยเสียงและวิดีโอแบบไม่สูญเสียเพื่อรักษาคุณภาพดั้งเดิม ...

-c:v -libx264 -preset ultrafast -qp 0 -c:a pcm_s16le

... จากนั้นให้เข้ารหัสไฟล์สุดท้ายโดยใช้การตั้งค่าเสียง / วิดีโอเดียวกับที่ใช้ในการสร้างวิดีโอต้นฉบับ


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