การใช้ตัวแปลงสัญญาณวิดีโอแบบไม่สูญเสียสำหรับการเก็บถาวรข้อมูลวิดีโอทางวิทยาศาสตร์ (ขาวดำ)


9

คำถามพื้นฐาน: ตัวแปลงสัญญาณที่เหมาะสมสำหรับการจัดเก็บ / จัดเก็บข้อมูลวิดีโอทางวิทยาศาสตร์ในลักษณะที่ไม่มีการสูญเสียคืออะไร?

ฉันพยายามช่วยกลุ่มวิจัยของฉันในการจัดเก็บ / เก็บวิดีโอที่บันทึกด้วยกล้องจุลทรรศน์ วิดีโอ (สีเทา) เหล่านี้อยู่ในรูปแบบ BGR24 ที่ไม่บีบอัด (rawvideo) 660x492 @ 61fps และโดยทั่วไปจะมีความยาวประมาณ 1 นาที เพื่อนในห้องแล็บของฉันกำลังคลั่งไคล้ขนาดไฟล์ที่แท้จริงเหล่านี้ (แต่ละกิกะไบต์) ฉันแนะนำให้บีบอัดโดยใช้ตัวแปลงสัญญาณแบบไม่สูญเสีย (ความจำเป็นในการสูญเสียที่นี่เป็นเพราะวิดีโอเป็นข้อมูลทางวิทยาศาสตร์ดังนั้นจึงมีความเสี่ยงที่ตัวแปลงสัญญาณที่สูญหายอาจเปลี่ยนแปลงเนื้อหาในรูปแบบที่ไม่ดี / ไม่คาดคิด)

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

ffmpeg -t 10 -i RecordedData.avi -c:v rawvideo -pix_fmt gray raw_gray.mkv

จากนั้นฉันพยายามใช้โหมด lossless ของ libx264 (โดยการตั้งค่า-crf 0) เพื่อบีบอัดไฟล์ผลลัพธ์

ffmpeg -i raw-gray.mkv -c:v libx264 -crf 0 -pix_fmt yuv420p -color_range pc x264-yuv420p.mkv

ในที่สุดฉันก็ดึงข้อมูล raw YUV จากทั้งไฟล์ raw และ h264 MKV และเปรียบเทียบมัน

ffmpeg -i raw-gray.mkv -c:v rawvideo -pix_fmt gray raw-gray.yuv
ffmpeg -i x264-yuv420p.mkv -c:v rawvideo -pix_fmt gray x264-decompressed.yuv
diff -sq raw-gray.yuv x264-decompressed.yuv

ที่นี่diffคำสั่งรายงานว่าไฟล์แตกต่างกันเมื่อฉันคาดว่าพวกเขาจะเหมือนกัน ทำไมนี้ นี่เป็นข้อผิดพลาดในการปัดเศษเล็กน้อยหรือฉันอาจสูญเสียบางสิ่งบางอย่างหลังจากทำการบีบอัด H264 (คาดว่าไม่มีการสูญเสีย) หรือไม่ มีการแปลงรูปแบบพิกเซลบางอย่างเกิดขึ้น ( gray (YUV400) <-> YUV420) แต่ช่องสี (UV) ควรจะว่างเปล่าเนื่องจากอินพุตเป็นแบบขาวดำ

หากฉันสูญเสียบางสิ่งบางอย่างฉันสามารถแก้ไขสิ่งนี้ได้ไหม? มีตัวแปลงสัญญาณอื่น (ไม่สูญเสีย) ที่เหมาะสมกับข้อมูลของฉันหรือไม่


อัปเดต 1 : ฉันใช้ hexdump เพื่อเปรียบเทียบเนื้อหาของข้อมูล YUV ที่raw-gray.yuvไม่บีบอัดจาก(ไม่บีบอัด) และx264-decompressed.yuv(บีบอัดแล้วแตก) ในรายละเอียดเพิ่มเติม นี่คือสองสามไบต์แรก

[raw-gray.yuv]

00000000  4e 50 51 53 53 52 51 50  51 51 50 4f 50 50 50 50
00000010  51 51 50 51 52 53 51 51  52 52 53 53 52 51 51 53
00000020  51 53 54 55 53 51 52 54  53 53 52 50 51 50 52 52
00000030  51 52 51 51 51 52 54 52  52 52 51 51 51 53 57 58
00000040  57 57 55 54 54 52 53 51  51 52 53 55 55 54 53 53
00000050  51 51 52 52 53 52 51 50  50 50 50 51 51 4f 4f 4e
00000060  4c 4d 4e 4d 4f 50 4f 50  51 51 51 52 52 52 52 50
00000070  50 50 52 52 53 55 55 55  57 52 53 53 53 54 56 56

[x264-decompressed.yuv]

00000000  53 55 56 57 57 56 56 55  56 56 55 54 55 55 55 55
00000010  56 56 55 56 56 57 56 56  56 56 57 57 56 56 56 57
00000020  56 57 58 59 57 56 56 58  57 57 56 55 56 55 56 56
00000030  56 56 56 56 56 56 58 56  56 56 56 56 56 57 5b 5c
00000040  5b 5b 59 58 58 56 57 56  56 56 57 59 59 58 57 57
00000050  56 56 56 56 57 56 56 55  55 55 55 56 56 54 54 53
00000060  51 52 53 52 54 55 54 55  56 56 56 56 56 56 56 55
00000070  55 55 56 56 57 59 59 59  5b 56 57 57 57 58 5a 5a

ค่าจากไฟล์เก่าคือ 4 ถึง 5 น้อยกว่าค่าในหลัง พบว่าเหมือนกันขุดลึกลงไปในไฟล์เล็กน้อย


อัปเดต 2 : ถ้าฉันใช้ libx264 ในโหมด RGB ฉันจะได้รับการจับคู่ที่แน่นอนกับต้นฉบับโดยทำเช่นเดียวกันกับข้างต้นนอกเหนือจากต่อไปนี้

ffmpeg -i raw-gray.mkv -c:v libx264rgb -crf 0 -pix_fmt bgr24 x264-bgr24.mkv
ffmpeg -i x264-bgr24.mkv -c:v rawvideo -pix_fmt gray x264-bgr24-decomp.yuv
diff -sq raw-gray.yuv x264-bgr24-decomp.yuv

คำสั่งสุดท้ายรายงานว่าทั้งสองไฟล์เหมือนกัน น่าเสียดายที่x264-bgr24.mkvมีขนาดใหญ่กว่าประมาณ 3 เท่าx264-yuv420.mkvดังนั้นการบีบอัดในโหมด RGB จึงไม่ดีเท่านี้

ฉันอ่านที่ไหนสักแห่งที่ libx264 บีบอัดวิดีโอระดับสีเทาอย่างมีประสิทธิภาพในโหมด YUV เพราะรับเฉพาะข้อเท็จจริงที่ว่ามีเพียงช่อง Y เท่านั้นที่มีข้อมูลจริง (ช่อง U และ V เป็นศูนย์สำหรับวิดีโอขาวดำ) ในโหมด RGB ฉันเชื่อว่าทุกช่องจะมีข้อมูลเหมือนกันสำหรับอินพุตขาวดำ บางที libx264rgb ไม่ได้ใช้ประโยชน์จากสิ่งนั้น

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


ปรับปรุง 3 : ฉันก็สามารถที่จะแก้ปัญหาด้วย libx264 โดยใช้แทน-pix_fmt yuvj420p -pix_fmt yuv420p -color_range pcจากนั้นฉันทำซ้ำไฟล์ต้นฉบับหลังจากการบีบอัด / คลายการบีบอัด จากเอกสาร FFmpeg ฉันมีความรู้สึกว่าทั้งสองชุดของธงมีความเท่าเทียมกัน แต่นี่ไม่ใช่กรณี ปัญหาเดียวคือฉันได้รับคำเตือนด้วยชุดธงหลัง: [swscaler @ 0x55b56347fe20] deprecated pixel format used, make sure you set the range correctly. นอกจากนี้ฉันพบรายงานข้อผิดพลาดนี้ที่อาจเกี่ยวข้องกับปัญหาของฉัน ฉันไม่แน่ใจเกี่ยวกับวิธีที่ "เหมาะสม" ในการทำสิ่งต่าง ๆ โดยไม่ใช้รูปแบบพิกเซล yuvj420p ที่เห็นได้ชัดว่าเลิกใช้แล้ว


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

1
แหล่งที่มาของการหยุดชะงักที่เป็นไปได้อย่างหนึ่งอาจเป็นตัวหนีบช่องสัญญาณ Y ที่แตกต่างกัน (ตาม CCIR-601) ตรวจสอบว่ามีโอกาสที่คุณสูญเสียค่า Y ต่ำกว่า 16 และมากกว่า 240 หรือไม่ดูวิดีโอvideo.stackexchange.com/questions/16840/…
LSerni

1
คุณยังสามารถใช้ ffmpeg เพื่อแยกวิดีโอทั้งสองของคุณออกเป็นภาพแต่ละภาพและใช้imagemagickcompareเพื่อเปรียบเทียบ
xenoid

1
วิธีที่ดีในการเปรียบเทียบความสูญเสียคือใช้hash muxer ffmpeg -i RecordedData.aviแสดงผลลัพธ์ที่สมบูรณ์ของ libx264rgb รองรับ bgr24 ดังนั้นคุณอาจพิจารณาตัวเข้ารหัสนั้นเป็นตัวเลือก
llogan

1
เพียงเข้ารหัสพวกเขาโดยไม่สูญเสียโดยใช้โหมด RGB ที่ x264 (การแปลงรูปแบบพิกเซลข้าม)
Gyan

คำตอบ:


6

นี่ไม่ใช่คำตอบที่ตรงกับปัญหาที่แท้จริงของคุณ แต่ฉันจะพิจารณาใช้FFV1ตัวแปลงสัญญาณFFmpeg- ภายใน:

$ ffmpeg -i raw-gray.mkv -c:v ffv1 ffv1.mkv

อีกวิธีหนึ่งเวอร์ชัน 3 ของมัน:

$ ffmpeg -i raw-gray.mkv -c:v ffv1 -level 3 ffv1.mkv

แล้ว:

$ ffmpeg -i ffv1.mkv -c:v rawvideo -pix_fmt gray raw-gray.yuv
$ diff -sq raw-ffv1.yuv raw-gray.yuv
Files raw-ffv1.yuv and raw-gray.yuv are identical

มันไม่ได้มีประสิทธิภาพเท่ากับ libx264 ในโหมด lossless เมื่อใช้yuv420pแต่มันมีประสิทธิภาพมากกว่าการใช้ libx264 กับbgr24(ในการทดสอบของฉันอัตราการส่งข้อมูลอยู่ที่ใดที่หนึ่ง) บางสถาบันเช่นหอสมุดแห่งชาติยังตระหนัก FFV1 เป็นรูปแบบการรักษาที่เหมาะสม


นี่เป็นคำตอบสำหรับคำถามพื้นฐานดั้งเดิมของฉันซึ่งฉันได้แก้ไขเพื่อให้ชัดเจนยิ่งขึ้น ฉันไม่พบปัญหาใด ๆ กับ FFV1 ในความเป็นจริง FFV1 สามารถบรรลุอัตราส่วนการบีบอัดเช่นเดียวกับ libx264 (w / -crf 0 -preset medium) สำหรับวิดีโอเฉพาะของฉันและมันก็เร็วขึ้น ยิ่งไปกว่านั้นมันรองรับgrayรูปแบบพิกเซลโดยตรง แน่นอนว่านี่เป็นทางออกที่ยอดเยี่ยม
Nick C.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.