เข้ารหัส 256 บิตแมปบนพาเลทเป็น h264 โดยใช้ libav

กำลังแปลงบิตแมป 32 bpp เป็น 8bpp ด้วยจานสี 256 สี รูปภาพนี้ฉันต้องการเข้ารหัสโดยใช้ h264 และส่งผ่านซ็อกเก็ต และอีกด้านหนึ่งก็ถอดรหัสเฟรมและแสดงบน UI ของฉัน

จากตัวเข้ารหัส ด้านข้าง:

  1. จับภาพ 32 bpp
  2. จัดปริมาณภาพเป็น 8bpp ด้วยจานสี 256 สี
  3. Sws_scale ภาพจาก PIX_FMT_GRAY8 ถึง YUV420P
  4. เข้ารหัสด้วย h264 และส่งผ่านซ็อกเก็ต

จากตัวถอดรหัสด้านข้าง

  1. รับภาพ.
  2. ถอดรหัสภาพ
  3. Sws_scale จาก YUV420P ถึง PIX_FMT_GRAY8
  4. และแสดงบน UI พร้อมกับข้อมูลพาเล็ต (ส่งจาก Encoder ผ่านซ็อกเก็ต)

เมื่อทำตามขั้นตอนข้างต้น ฉันจะได้ภาพที่บิดเบี้ยวโดยสิ้นเชิง และเมื่อฉันไม่ใช้จานสี ฉันจะได้ภาพขาวดำ

ฉันไม่ชัดเจนว่าจะเข้ารหัสบิตแมปจานสี 8bpp 256 โดยใช้ h264 และถอดรหัสตามนั้นได้อย่างไร โปรดช่วยฉันเกี่ยวกับเรื่องนี้

ฉันกำลังทำงานกับ C ++ บนแพลตฟอร์ม windows

ขอบคุณล่วงหน้าพอล


person user3239282    schedule 12.02.2014    source แหล่งที่มา


คำตอบ (1)


h.264 ไม่ใช่ (โดยค่าเริ่มต้น) ตัวแปลงสัญญาณแบบไม่สูญเสียข้อมูล ดังนั้นคุณจะไม่ได้สีที่แน่นอนที่คุณใส่ไว้แบบพิกเซลต่อพิกเซล ใน YUV แผน Y คือความสว่าง (ขาวดำ) และระนาบ UV คือโครเมียม เครื่องบินยูวีของคุณจึงว่างเปล่าที่นี่ ระนาบ Y ถูกบีบอัดในลักษณะสูญเสีย ดังนั้นคุณอาจมีพาเลทที่มีลักษณะดังนี้ 0=สีดำ 1=สีแดง 2=สีเขียว ... 255=สีขาว และคุณใส่ 2 พิกเซล ในระหว่างการบีบอัด เพื่อลบความซับซ้อนของภาพเพื่อลดขนาดไฟล์ 2 อาจกลายเป็น 1 ในภาพขาวดำ คุณจะไม่สังเกตเห็นความแตกต่าง แต่เมื่อคุณใช้พาเลท พิกเซลสีเขียวของคุณจะกลายเป็นสีแดง

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

person szatmary    schedule 12.02.2014
comment
สวัสดี szatmary ขอบคุณที่ให้แสงสว่าง คุณช่วยแนะนำไลบรารี C หรือ C ++ ให้ฉันหน่อยได้ไหม ซึ่งสามารถแปลงรูปภาพสี 256 ภาพเป็นรูปภาพ YUV ได้ เนื่องจากฉันยังใหม่กับสาขานี้ - person user3239282; 13.02.2014
comment
Libswscale จะทำมัน - person szatmary; 13.02.2014
comment
และฉันจะหาปริมาณรูปภาพใหม่ได้อย่างไร มีไลบรารีสำหรับสิ่งนี้หรือไม่ - person user3239282; 14.02.2014
comment
ฉันไม่รู้บางที คุณเพียงแค่ต้องค้นหาสีที่ 'ใกล้เคียงที่สุด' ในจานสีของคุณ ระยะทางยูคลิเดียน 3 มิติอาจไม่ใช่วิธีที่ดีนัก อาจจะ PSNR? ฉันจะเปิดคำถามอื่นเพื่อขอคำตอบจากคนที่รู้เกี่ยวกับทฤษฎีสีมากกว่าฉัน - person szatmary; 14.02.2014