การตัดต่อวิดีโอบางส่วนโดยไม่มีการแปลงรหัส


1

เป็นไปได้ไหมที่จะทำการแก้ไขบางส่วนในแต่ละเฟรมของวิดีโอ (เช่นการเพิ่มโลโก้) โดยไม่แปลงรหัส? และบันทึกวิดีโอด้วยรูปแบบเดียวกันหรือไม่

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

ฉันรู้ว่าในรูปแบบ XviD นี้เป็นไปไม่ได้ (อย่างน้อยก็ง่าย ๆ ) แต่มันเป็นไปไม่ได้อย่างสมบูรณ์หรือเป็นไปได้สำหรับรูปแบบบางประเภท (เช่น MPG หรือ AVI AVI)?

คำตอบ:


5

นี่เป็นไปได้ (ในทางปฏิบัติ) เท่านั้นสำหรับการเข้ารหัสวิดีโอที่ไม่มีการสูญเสีย

ไม่สูญเสียผลขาดทุน

มันง่ายมากที่จะทำสิ่งที่คุณต้องการสำหรับตัวแปลงสัญญาณวิดีโอที่เข้ารหัสแบบไม่สูญเสีย จำนวนของผู้ที่เก็บข้อมูลวิดีโอพิกเซลโดยพิกเซลส่วนใหญ่ในcolorspace YUV ทุกเฟรมย่อมาจากตัวมันเอง

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

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

รักษาการเข้ารหัสแบบ lossy

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

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

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

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

ปัญหาก็คือความจริงที่ว่าสำหรับวิดีโอสูญเสียมากที่สุดเฟรมบางขึ้นอยู่กับข้อมูลที่มีอยู่ในกรอบอื่นโดยเฉพาะอย่างยิ่ง B- และ P-frames จะมีการออฟเซ็ต B / P หรือ I-frames ก่อนหน้านี้เท่านั้น หากคุณเปลี่ยนเนื้อหาของ I-frame เฟรมที่ขึ้นต่อกันอื่น ๆ ทั้งหมดจะเปลี่ยนไปเมื่อพวกมันถูกถอดรหัสซึ่งโดยปกติจะไม่ใช่สิ่งที่คุณต้องการ คำตอบของ Peter Cordes อยู่ด้านล่างไฮไลท์จุดนี้ และแน่นอนว่าเขามีสิทธิที่ในหลักการคุณสามารถแก้ไขได้สูญเสียผมกรอบเพียงวิดีโอในสถานที่แต่มันจะเป็นจริงยากมากที่จะประสบความสำเร็จ

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


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

อย่างแน่นอน ฉันพยายามอธิบายส่วนนั้น แต่คำตอบของคุณดี ฉันคิดว่าฉันกำลังคิดเกี่ยวกับสิ่งที่เป็นจริงในแง่ของ ... มีเครื่องมือที่ทำงานนี้ และฉันยังไม่เห็นการใช้งานที่ดีของสิ่งที่ปรับเปลี่ยนบิตสตรีมเพื่อเปลี่ยนความถี่ macroblock ในลักษณะที่การแปลงผกผันให้สิ่งที่คุณต้องการในตอนแรก (ตามที่ระบุในโดเมนพิกเซล)
slhck

ใช่ฉันเห็นด้วยกับคนส่วนใหญ่ไม่ต้องการขยายวิดีโอของพวกเขาด้วยปัจจัย 10 ถึง 100 เนื่องจากถ้ามีสิ่งประดิษฐ์อยู่แล้วจากบางสิ่งบางอย่างมันจึงง่ายต่อการยอมรับมากขึ้น
Peter Cordes

Re: การแฮ็กบิตสตรีม: ยังมีเครื่องมือ jpeg แบบภาพนิ่งเช่นjpegclub.org/jpegtran (บรรจุมาสำหรับอายุใน distros Linux ส่วนใหญ่ซึ่งเป็นส่วนหนึ่งของ libjpeg-progs / libjpeg-turbo-progs) ที่ทำการแปลงแบบไม่สูญเสียเช่นครอบตัดหมุนหรือแม้แต่ rescale (DCT เย็น) การแทนที่บางบล็อกด้วยบล็อกอื่น ๆ นั้นก็ง่ายเช่นกัน แต่ IDK ถ้ามีรหัสที่มีอยู่แล้ว
Peter Cordes

จริงดูเหมือนว่ามีรหัสที่มีอยู่: ฉันเห็นjpegclub.org/jpegjoin/jpegjoin.txt "วัตถุประสงค์หลักของ Jpegjoin คือการเขียน (เข้าร่วม) หลายภาพเป็นภาพเดียวคล้ายกับการจัดเรียงของเซลล์แถวและคอลัมน์ในตารางนอกจากนี้ยังมีคุณสมบัติในการวางโลโก้และภาพตำนานที่ด้านล่างของเซลล์ "
Peter Cordes

2

slhck นั้นถูกต้องหากเรากำลังพูดถึงตัวแปลงสัญญาณวิดีโอที่ซับซ้อนที่มีการเคลื่อนไหวเวกเตอร์ (แก้ไข: อันที่จริงการคาดการณ์ภายในหรือการทำนายระหว่าง) คุณสามารถปรับเปลี่ยนกระแสข้อมูล h.264 ได้ด้วยการเข้ารหัส macroblocks ใหม่ในพื้นที่ที่คุณต้องการแทนที่ด้วยโลโก้ของคุณ โลโก้ในเฟรม I ข้ามบล็อกในเฟรม P และ B แต่ทุกครั้งที่แพนกล้องจะมีบล็อกใกล้เคียงที่รับข้อมูลภาพโดยคัดลอกจากส่วนหนึ่งของภาพที่มีโลโก้อยู่ในขณะนี้ ดังนั้นขอบของโลโก้ของคุณจะถูกคัดลอกไปทั่วทำให้ส่วนอื่น ๆ ของภาพเสียหายจนเฟรมต่อไปของฉัน

ดังนั้นเขาพูดถูก แต่เป็นเพราะการอ้างอิงไม่ใช่ความสูญเสีย (แก้ไข: การแก้ไขของเขาทำให้เกิดความสับสนมากที่สุด)

สำหรับตัวแปลงสัญญาณที่ง่ายขึ้นซึ่งทุกบล็อกมีความเป็นอิสระ (ไม่ใช่แม้กระทั่งการคาดการณ์ภายใน) เช่น mjpeg คุณสามารถแทนที่บล็อกที่เข้ารหัสในพื้นที่ที่คุณต้องการโลโก้โดยไม่ต้องถอดรหัส / เข้ารหัสส่วนที่เหลือของรูปภาพใหม่ ฉันคิดว่ามีการสนับสนุนการทำเช่นนี้ในไฟล์ภาพ jpeg ไฟล์เดียว แต่ IDK หากมีสิ่งใดรองรับไฟล์ mjpeg โดยไม่แยกเฟรมออกเป็นไฟล์ jpeg แยกกัน

http://jpegclub.org/jpegjoin/jpegjoin.txtมีข้อมูลเกี่ยวกับวิธีการใช้ jpegtran เพื่อแทนที่บล็อกบางส่วนของไฟล์ jpeg โดยไม่ต้องถอดรหัส / เข้ารหัสส่วนที่เหลือของภาพ

นี่คือตัวอย่างของการล้อเล่นรอบกับวิดีโอสตรีมโดยไม่ต้องถอดรหัส / เข้ารหัสอีกครั้ง ซ่อนข้อมูลในสตรีม h.264 ในค่าสัมประสิทธิ์ต่ำของ macroblocks ของ iPCM (ตามตัวอักษรไม่ใช่ DCTed การเข้ารหัส) คุณต้องถอดรหัส / เข้ารหัส CAPAC เลเยอร์เอนโทรปี - เข้ารหัสอีกครั้ง (เป็นการบีบอัดแบบซิปสุดท้ายสำหรับบิตสตรีม)

หากแหล่งที่มาอยู่ในรูปแบบที่ไม่มีการสูญเสียคุณจะไม่ต้องเสียค่าใช้จ่ายมากขนาดไฟล์ด้วยการคลายบีบอัดแก้ไขและบีบอัดข้อมูลทั้งหมดเพียงแค่ CPU รูปแบบที่ไม่มีการสูญเสียจำนวนมากมักจะซิปแต่ละเฟรมแยกจากกันแทนที่จะดำเนินการกับบล็อกดังนั้นคุณต้องทำการขยายการบีบอัดแก้ไขใหม่ Lossless h.264 นั้นมีการคาดการณ์ระหว่างและภายในของการสูญเสีย h.264 ตามปกติดังนั้นแม้ว่ามันจะมี macroblocks แต่ก็จำเป็นต้องมีการถอดรหัสการแก้ไขแบบเต็มรูปแบบเช่นกัน

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


1

ฉันจะบอกว่ามันควรจะเป็นไปได้

ในช่วงที่สหรัฐฯเปลี่ยนเป็น OTA HD (ATSC) เครือข่ายเกือบทั้งหมดให้บริการวิดีโอจากโฮมสตูดิโอผ่านดาวเทียมโดยใช้สตรีมวิดีโออัตราบิตสูงมาก (สูงกว่าอัตราบิต OTA มาก) จากนั้นพวกเขาก็ให้แต่ละสถานีโทรทัศน์ท้องถิ่นพร้อมตัวถอดรหัสและตัวเข้ารหัสบิตเรตต่ำกว่าดังนั้นพวกเขาจึงสามารถถอดรหัสสตรีมคุณภาพสูงได้อย่างสมบูรณ์เพิ่มโลโก้สถานีของพวกเขาแทรกภาพ ฯลฯ และเข้ารหัสบิตเรตมาตรฐานการออกอากาศเพื่อส่งสัญญาณ

อย่างไรก็ตามเครือข่ายฟ็อกซ์เลือกที่จะเข้ารหัสสตรีมในสตูดิโอในบ้านของพวกเขาน่าจะใช้เครื่องเข้ารหัส (และค่าใช้จ่าย) คุณภาพสูงกว่า แต่ใช้อัตราบิตของการออกอากาศ จากนั้นพวกเขาให้ "ผู้ต่อเชือก " ให้กับ บริษัท ในเครือแต่ละแห่งซึ่งสามารถถอดรหัสสตรีมบางส่วนใส่โลโก้รวบรวมข้อมูล ฯลฯ จากนั้นเข้ารหัสอีกครั้งก่อนออกอากาศ

ฉันรู้ว่ากระแส MPEG-2 ที่ใช้ในการออกอากาศ OTA นั้นแตกต่างจาก h.264 / MPEG-4 แต่จากสิ่งที่ฉันรู้รายละเอียดทางเทคนิคของรูปแบบนี้น่าจะเป็นไปได้มากกับ h.264 / MPEG-4 . (อันที่จริงแล้ว MPEG-4 ได้เพิ่มคุณสมบัติที่รองรับการผสมแบบอัลฟาถึงแม้ว่าฉันสงสัยว่าตัวถอดรหัสบางตัวอาจรองรับคุณสมบัตินี้ได้จริง)

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

แก้ไข : ฉันพบบทความนี้ใน " การแทนที่ขอบเขตรูปภาพในบิตสตรีม H.264 / AVC โดยใช้ชิ้นส่วนอิสระ " ที่ปรากฏเพื่อให้รายละเอียดทางเทคนิคเพื่อให้บรรลุสิ่งนี้ แต่ฉันยังคงมองหาซอฟต์แวร์พิสูจน์แนวคิดบางอย่าง

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