การถอดรหัสคือกระบวนการแปลงสตรีมสื่อที่ถูกบีบอัดให้เป็นรูปแบบที่ไม่ถูกบีบอัดซึ่งเหมาะสมสำหรับการแสดงผลบนหน้าจอและลำโพง ในอุปกรณ์มือถือ การถอดรหัสจะดำเนินการผ่านซอฟต์แวร์บน CPU หรือผ่านฮาร์ดแวร์ผ่านบล็อก GPU และ DSP เฉพาะทาง ตามข้อมูลจาก MDN Web Docs (2026) โคเดกสมัยใหม่บีบอัดสตรีมได้ 100–500 เท่า และ การถอดรหัส จะคืนคุณภาพดั้งเดิมโดยไม่สูญเสียเมื่อเลือกโปรไฟล์การบีบอัดที่ถูกต้อง
ประเด็นสำคัญ
การถอดรหัส คือกระบวนการแปลงข้อมูลดิจิทัลที่ถูกบีบอัดกลับเป็นรูปแบบที่ไม่ถูกบีบอัดดั้งเดิม ในบริบทของสื่อ การถอดรหัสจะคืนเฟรมวิดีโอจากบิตสตรีมที่ถูกบีบอัดซึ่งสร้างโดยตัวเข้ารหัส หากไม่มีการถอดรหัส ผู้ใช้จะไม่สามารถดูวิดีโอหรือฟังเสียงได้ เนื่องจากรูปแบบสื่อสมัยใหม่ทั้งหมดใช้การบีบอัดเพื่อประหยัดแบนด์วิดท์และพื้นที่ดิสก์
สตรีมวิดีโอทั่วไปในรูปแบบ H.264 ที่บิตเรต 5 Mbps ใช้พื้นที่น้อยกว่าสตรีม RGB ที่ไม่ถูกบีบอัดที่มีความละเอียดเท่ากันถึง 100 เท่า อัลกอริทึมการถอดรหัส ต้องคืนแต่ละเฟรมกลับไปยังความละเอียดและปริภูมิสีดั้งเดิม โดยทำตามข้อกำหนดของโคเดกในลำดับย้อนกลับเมื่อเทียบกับการเข้ารหัส ในการดำเนินการนี้ ตัวถอดรหัสจะประมวลผลข้อมูลภายในเฟรม (I-frame) และระหว่างเฟรม (P-frame, B-frame)
บนอุปกรณ์มือถือ การถอดรหัสสามารถเกิดขึ้นได้ทั้งบน CPU หรือบนบล็อกฮาร์ดแวร์เฉพาะ SoC สมัยใหม่จาก Apple (ซีรีส์ A), Qualcomm (Snapdragon) และ MediaTek (Dimensity) มีตัวถอดรหัสในตัวสำหรับทุกรูปแบบยอดนิยม โปรเซสเซอร์วิดีโอ จัดการงานหนักของการแปลงโคไซน์ไม่ต่อเนื่องผกผันและการชดเชยการเคลื่อนที่ ทำให้ CPU ว่างสำหรับงานอื่น
กระบวนการถอดรหัสประกอบด้วยหลายขั้นตอนต่อเนื่องที่ย้อนกลับขั้นตอนการเข้ารหัส ขั้นแรก ส่วนหัวและพารามิเตอร์การบีบอัด — โปรไฟล์ ระดับ ความละเอียด ปริภูมิสี — จะถูกแยกจากบิตสตรีม จากนั้นตัวถอดรหัสจะประมวลผลแมโครบล็อกที่ถูกบีบอัดตามลำดับ โดยใช้การแปลงผกผันกับแมโครบล็อกเหล่านั้น
ขั้นตอนแรกคือการแยกรหัสเอนโทรปี การถอดรหัสเอนโทรปี ใช้อัลกอริทึม CABAC หรือ CAVLC เพื่อคืนค่าสัมประสิทธิ์การแปลงโคไซน์ไม่ต่อเนื่อง ขั้นตอนนี้ไม่ขึ้นกับความละเอียดวิดีโอ — มันประมวลผลสตรีมของบิต ไม่ใช่พิกเซล และความซับซ้อนของมันถูกกำหนดโดยบิตเรต ไม่ใช่ขนาดเฟรม
ขั้นตอนที่สองคือการควอนไทซ์ผกผันและการแปลง DCT ผกผัน ตัวถอดรหัสคูณสัมประสิทธิ์ที่ถูกควอนไทซ์ด้วยขั้นตอนการควอนไทซ์ คืนค่าโดยประมาณของสัมประสิทธิ์ DCT จากนั้นใช้การแปลง DCT ผกผัน DCT ผกผัน คืนข้อมูลเชิงพื้นที่จากโดเมนความถี่ สร้างแมโครบล็อกของพิกเซล การแปลงจะดำเนินการแยกกันสำหรับโครมาและลูมา
ขั้นตอนที่สามคือการชดเชยการเคลื่อนที่ สำหรับเฟรม P และ B ตัวถอดรหัสใช้เวกเตอร์การเคลื่อนที่ที่แยกจากบิตสตรีมและอ้างอิงถึงเฟรมอ้างอิงที่ถูกถอดรหัสก่อนหน้านี้ การชดเชยการเคลื่อนที่ สร้างตัวทำนายสำหรับแมโครบล็อกปัจจุบัน ซึ่งสัญญาณที่เหลือหลังจากการ DCT ผกผันจะถูกเพิ่มเข้าไป ผลลัพธ์คือเฟรมที่ถูกคืนสภาพอย่างสมบูรณ์พร้อมสำหรับการแสดงผล
// รหัสเทียมพื้นฐานของการถอดรหัสเฟรมวิดีโอ
struct DecodedFrame {
uint8_t* y_plane;
uint8_t* u_plane;
uint8_t* v_plane;
int width, height;
};
class Decoder {
public:
bool decodeNALUnit(const uint8_t* nalUnit, size_t size) {
if (!parseNALUHeader(nalUnit, size))
return false;
int sliceType = parseSliceType(nalUnit);
entropyDecode(nalUnit);
inverseQuantize();
inverseDCT();
if (sliceType != I_SLICE)
motionCompensation();
return true;
}
};
ตัวอย่างข้างต้นแสดงโครงสร้างพื้นฐานของตัวถอดรหัส H.264 ฟังก์ชัน decodeNALUnit รับหน่วย NAL — บล็อกพื้นฐานของสตรีม H.264 ที่ถูกบีบอัด ตัวถอดรหัสจะแยกวิเคราะห์ส่วนหัวตามลำดับ แยกประเภทสไลซ์ ใช้การถอดรหัสเอนโทรปี การควอนไทซ์ผกผัน และ DCT ผกผัน สำหรับสไลซ์ P และ B จะมีการชดเชยการเคลื่อนที่เพิ่มเติมโดยใช้เฟรมอ้างอิงจากบัฟเฟอร์ DPB
โคเดกวิดีโอสมัยใหม่แตกต่างกันในอัลกอริทึมการบีบอัด ประสิทธิภาพ และข้อกำหนดทรัพยากรการคำนวณ การเลือกรูปแบบส่งผลโดยตรงต่อขนาดไฟล์ คุณภาพของภาพ และการใช้พลังงานระหว่างการถอดรหัสบนอุปกรณ์มือถือ
| โคเดก | ปี | การบีบอัด | การรองรับฮาร์ดแวร์ |
|---|---|---|---|
| H.264 | 2003 | 1:100 | SoC สมัยใหม่ทั้งหมด |
| H.265 | 2013 | 1:200 | Apple A8+, Snapdragon 805+ |
| VP9 | 2013 | 1:180 | Snapdragon 820+, Exynos |
| AV1 | 2018 | 1:300 | Apple A17+, Snapdragon 8 Gen 2+ |
H.264 เป็นโคเดกวิดีโอที่แพร่หลายมากที่สุด รองรับโดยอุปกรณ์มือถือทั้งหมด ข้อได้เปรียบหลักคือความเป็นสากล: สมาร์ทโฟน Android และ iPhone ทุกเครื่องสามารถถอดรหัส H.264 ด้วยฮาร์ดแวร์ได้ อย่างไรก็ตาม ที่บิตเรตเดียวกัน H.264 มีคุณภาพด้อยกว่าโคเดกที่ใหม่กว่าเช่น H.265 และ AV1 โดยต้องใช้บิตเรตมากกว่า 30–50% เพื่อคุณภาพภาพที่ใกล้เคียงกัน
H.265 ให้การบีบอัดที่ดีกว่า H.264 ถึงสองเท่าในคุณภาพเดียวกัน การถอดรหัส H.265 ต้องใช้บล็อกฮาร์ดแวร์ที่ทรงพลังกว่า: VideoToolbox บน iOS รองรับ H.265 ตั้งแต่ iPhone 6 (A8) และอุปกรณ์ Android ตั้งแต่ Snapdragon 805 ขึ้นไป เมื่อเลือก H.265 สำหรับแอปมือถือ ต้องคำนึงว่าอุปกรณ์รุ่นเก่าอาจไม่มีการรองรับฮาร์ดแวร์และจะถอดรหัสรูปแบบนี้ด้วยซอฟต์แวร์ ซึ่งจะเพิ่มการใช้พลังงานอย่างมาก
AV1 เป็นโคเดกแบบเปิดจาก Alliance for Open Media ที่ให้การบีบอัดที่ดีที่สุดในทุกรูปแบบสมัยใหม่ AV1 มีประสิทธิภาพมากกว่า H.265 30% และมากกว่า H.264 50% ในคุณภาพภาพที่เท่ากัน การถอดรหัส AV1 ด้วยฮาร์ดแวร์ ปรากฏใน SoC ตั้งแต่ปี 2023+ เท่านั้น: Apple A17 Pro, Qualcomm Snapdragon 8 Gen 2 และใหม่กว่า สำหรับอุปกรณ์รุ่นเก่า การถอดรหัส AV1 ทำได้ด้วยซอฟต์แวร์ผ่านไลบรารี dav1d เท่านั้น ซึ่งสร้างโหลดอย่างมากบน CPU
การเลือกระหว่างการถอดรหัสด้วยซอฟต์แวร์และฮาร์ดแวร์เป็นการตัดสินใจทางสถาปัตยกรรมที่สำคัญเมื่อพัฒนาเครื่องเล่นสื่อมือถือ แต่ละวิธีมีข้อดีและข้อจำกัดที่ต้องพิจารณาเมื่อออกแบบแอปพลิเคชัน
การถอดรหัสด้วยฮาร์ดแวร์ดำเนินการบนบล็อกประมวลผลวิดีโอเฉพาะทางที่ใช้พลังงานน้อยกว่า CPU อย่างมากเมื่อทำงานเดียวกัน ตามข้อมูลของ Qualcomm ตัวถอดรหัส H.265 แบบฮาร์ดแวร์ใช้พลังงานน้อยกว่าการถอดรหัสด้วยซอฟต์แวร์บน CPU Snapdragon 8 Gen 1 ถึง 5–10 เท่าเมื่อเล่นวิดีโอ 4K ซึ่งมีความสำคัญสำหรับอุปกรณ์มือถือที่ทุกมิลลิวัตต์ส่งผลต่ออายุแบตเตอรี่
ในทางกลับกัน การถอดรหัสด้วยซอฟต์แวร์ให้ความยืดหยุ่นสูงสุด FFmpeg กับไลบรารี libavcodec รองรับโคเดกและคอนเทนเนอร์หลายสิบชนิด รวมถึงรูปแบบที่หายากและล้าสมัยที่ไม่มีการรองรับฮาร์ดแวร์ นักพัฒนาสามารถปรับเปลี่ยนไปป์ไลน์การถอดรหัส เพิ่มการประมวลผลภายหลังและฟิลเตอร์ได้ทันที ซึ่งเป็นไปไม่ได้เมื่อใช้บล็อกฮาร์ดแวร์แบบปิด
การถอดรหัสด้วยซอฟต์แวร์เหมาะสมในหลายสถานการณ์: เมื่อเล่นรูปแบบที่หายาก (ProRes, DNxHD, Motion JPEG) เมื่อต้องการควบคุมอย่างแม่นยำในแต่ละขั้นตอนของการประมวลผลเฟรม และเมื่อถอดรหัส AV1 บนอุปกรณ์ที่ไม่มีการรองรับฮาร์ดแวร์ libavcodec จาก FFmpeg สามารถถอดรหัสรูปแบบที่รู้จักแทบทุกชนิด ทำให้มันเป็นมาตรฐานโดยพฤตินัยสำหรับเครื่องเล่นสื่อสากล
ข้อจำกัดของการถอดรหัสด้วยซอฟต์แวร์คือการระบายความร้อน การถอดรหัสวิดีโอ 4K อย่างต่อเนื่องบน CPU สามารถทำให้อุปกรณ์ร้อนถึง 45–50 องศาภายใน 10–15 นาที ส่งผลให้เกิดการลดความเร็วและอัตราเฟรมลดลง บนอุปกรณ์ที่ไม่มีการระบายความร้อนแบบแอคทีฟ (แท็บเล็ต โทรศัพท์) จะสังเกตเห็นได้ชัดเป็นพิเศษ การใช้พลังงานของ CPU ระหว่างการถอดรหัสด้วยซอฟต์แวร์อาจสูงถึง 3–5 W เทียบกับ 0.3–0.5 W ระหว่างการถอดรหัสด้วยฮาร์ดแวร์ของสตรีมเดียวกัน
การถอดรหัสด้วยฮาร์ดแวร์เป็นตัวเลือกเริ่มต้นสำหรับเครื่องเล่นสื่อในระดับการผลิตใดๆ มันให้ 60 fps ที่เสถียรสำหรับวิดีโอ 4K โดยใช้พลังงานน้อยที่สุด VideoToolbox บน iOS และ MediaCodec บน Android มี API ดั้งเดิมสำหรับการถอดรหัสด้วยฮาร์ดแวร์ที่เลือกบล็อกประมวลผลที่เหมาะสมที่สุดโดยอัตโนมัติตามโคเดกและความละเอียด
API ของแพลตฟอร์มจัดการบัฟเฟอร์เฟรม (surface pool บน Android, CVPixelBufferPool บน iOS), การซิงโครไนซ์กับจอแสดงผล และการเพิ่มประสิทธิภาพหน่วยความจำ นักพัฒนาเพียงแค่เปิดตัวถอดรหัสด้วยพารามิเตอร์ที่ต้องการและรับเฟรมที่พร้อม การถอดรหัสด้วยฮาร์ดแวร์ รองรับไปป์ไลน์แบบ end-to-end ที่มีความหน่วงต่ำ: จากการรับบิตสตรีมจนถึงการแสดงบนหน้าจอใช้เวลา 5–15 มิลลิวินาที เทียบกับ 30–80 มิลลิวินาทีสำหรับการถอดรหัสด้วยซอฟต์แวร์
มาดูการใช้งานจริงของการถอดรหัสบนทั้งสองแพลตฟอร์มมือถือกัน บน iOS การถอดรหัสด้วยฮาร์ดแวร์ดำเนินการผ่าน VideoToolbox และการถอดรหัสด้วยซอฟต์แวร์ผ่าน FFmpeg บน Android ใช้ MediaCodec สำหรับการถอดรหัสด้วยฮาร์ดแวร์
@interface VideoDecoder ()
@property (nonatomic) VTDecompressionSessionRef session;
@end
@implementation VideoDecoder
- (void)setupDecoder {
CMVideoFormatDescriptionRef formatDesc;
CMVideoCodecType codecType = kCMVideoCodecType_H264;
OSStatus status = CMVideoFormatDescriptionCreate(
NULL, codecType, 1920, 1080, NULL, &formatDesc
);
VTDecompressionOutputCallbackRecord callback;
callback.decompressionOutputCallback = &decodingCallback;
VTDecompressionSessionCreate(NULL, formatDesc, NULL,
NULL, &callback, &_session);
}
- (void)decodeFrame: (uint8_t*)nalData length:(size_t)size {
CMBlockBufferRef blockBuffer;
CMBlockBufferCreateWithMemoryBlock(NULL, nalData,
size, NULL, NULL, 0, size, 0, &blockBuffer);
CMSampleBufferRef sampleBuffer;
CMSampleBufferCreate(NULL, blockBuffer, true, NULL,
NULL, NULL, 1, 0, NULL, 0, NULL, &sampleBuffer);
VTDecompressionSessionDecodeFrame(_session,
sampleBuffer, 0, NULL, 0);
}
@end
โค้ดแสดงการเริ่มต้นตัวถอดรหัส H.264 แบบฮาร์ดแวร์บน iOS VTDecompressionSessionCreate สร้างเซสชันการถอดรหัส และ VTCreate เรียก callback เมื่อเฟรมที่พร้อมปรากฏ เซสชันจะใช้บล็อกฮาร์ดแวร์โดยอัตโนมัติหากพร้อมใช้งานสำหรับโคเดกที่ระบุ เพื่อให้ได้เฟรมที่ถอดรหัสแล้วในรูปแบบ CVPixelBuffer จะใช้ callback ที่ส่งแต่ละเฟรมที่พร้อมด้วยความหน่วงต่ำที่สุด
MediaCodec decoder = MediaCodec.createDecoderByType("video/avc");
MediaFormat format = MediaFormat.createVideoFormat(
"video/avc", 1920, 1080
);
format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
decoder.configure(format, surface, null, 0);
decoder.start();
ByteBuffer[] inputBuffers = decoder.getInputBuffers();
int inputIndex = decoder.dequeueInputBuffer(10000);
if (inputIndex >= 0) {
ByteBuffer buffer = inputBuffers[inputIndex];
buffer.clear();
buffer.put(nalData);
decoder.queueInputBuffer(inputIndex, 0, nalData.length, pts, 0);
}
บน Android MediaCodec ใช้ Surface สำหรับเอาต์พุตแทนบัฟเฟอร์พิกเซล ซึ่งลดการคัดลอกข้อมูลระหว่าง GPU และ CPU ตัวถอดรหัสเลือกบล็อกฮาร์ดแวร์ (ส่วนประกอบ OMX) โดยอัตโนมัติตามประเภทโคเดก สำหรับ H.264 จะใช้ OMX.google.h264.decoder ซึ่งอาจเป็นฮาร์ดแวร์หรือซอฟต์แวร์ขึ้นอยู่กับการใช้งานของผู้ผลิต
การเลือกกลยุทธ์การถอดรหัสขึ้นอยู่กับกลุ่มเป้าหมายของแอปพลิเคชัน รูปแบบที่รองรับ และข้อกำหนดด้านประสิทธิภาพ โซลูชันที่ดีที่สุดมักรวมถึงแนวทางแบบผสม: การถอดรหัสด้วยฮาร์ดแวร์สำหรับรูปแบบหลัก (H.264, H.265) พร้อมการสำรองด้วยซอฟต์แวร์สำหรับโคเดกที่หายาก
หากแอปพลิเคชันมุ่งเน้นความเข้ากันได้สูงสุด — ใช้ H.264 ซึ่งรับประกันว่าถอดรหัสด้วยฮาร์ดแวร์บนอุปกรณ์ใดๆ สำหรับบริการสตรีมมิงวิดีโอ H.265 ที่มีการรองรับฮาร์ดแวร์บนอุปกรณ์หลังปี 2016 เหมาะสม AV1 เป็นตัวเลือกสำหรับบริการที่การประหยัดแบนด์วิดท์สำคัญ: YouTube, Netflix และแพลตฟอร์มใหญ่อื่นๆ กำลังนำ AV1 มาใช้อย่างแข็งขันเพื่อลดต้นทุน CDN ในขณะที่รักษาคุณภาพ
พารามิเตอร์ที่สำคัญคือขนาดบัฟเฟอร์ของตัวถอดรหัส ตัวถอดรหัสฮาร์ดแวร์มีพูลบัฟเฟอร์คงที่ (ปกติ 4–16 เฟรม) เมื่อเล่นสตรีมบิตเรตสูง บัฟเฟอร์อาจล้น ส่งผลให้เฟรมหาย MediaCodec มีเมธอด getOutputFrameRate เพื่อกำหนดประสิทธิภาพจริงของตัวถอดรหัสบนอุปกรณ์เฉพาะ ในขณะที่ VideoToolbox ช่วยให้ควบคุมลำดับความสำคัญแบบเรียลไทม์ผ่าน kVTDecodeFrame_EnableAsynchronousDecompression
การลดความเร็วเนื่องจากความร้อนเป็นอีกปัจจัยหนึ่ง แม้แต่การถอดรหัสด้วยฮาร์ดแวร์ก็สามารถทำให้อุปกรณ์ร้อนระหว่างการเล่นวิดีโอ 4K HDR เป็นเวลานาน แนะนำให้ตรวจสอบอุณหภูมิผ่าน ProcessInfo บน iOS และ BatteryManager บน Android โดยลดคุณภาพหรือความละเอียดสตรีมเมื่อเกิดความร้อนสูงเกินไป ซึ่งสำคัญอย่างยิ่งสำหรับเกมและแอปพลิเคชันสตรีมมิงที่มีเซสชันการรับชมยาวนาน
คำถามที่พบบ่อย
การเข้ารหัส (encoding) แปลงข้อมูลที่ไม่ถูกบีบอัดเป็นรูปแบบที่ถูกบีบอัด ในขณะที่การถอดรหัส (decoding) คืนข้อมูลดั้งเดิมจากสตรีมที่ถูกบีบอัด กระบวนการทั้งสองนี้เป็นสิ่งที่กลับกันและใช้อัลกอริทึมเดียวกัน: DCT, การควอนไทซ์, การชดเชยการเคลื่อนที่ ตัวเข้ารหัส ดำเนินการแปลงไปข้างหน้า ตัวถอดรหัสดำเนินการแปลงย้อนกลับ
เพื่อความเข้ากันได้สูงสุด — H.264 เนื่องจากถูกถอดรหัสด้วยฮาร์ดแวร์บน 100% ของอุปกรณ์สมัยใหม่ เพื่อการบีบอัดที่ดีขึ้น — H.265 หรือ AV1 การเลือกขึ้นอยู่กับกลุ่มผู้ใช้: หาก 80% ของผู้ใช้อุปกรณ์ตั้งแต่ปี 2021+ H.265 จะให้คุณภาพที่ดีกว่าที่บิตเรตต่ำกว่า AV1 เหมาะสำหรับอุปกรณ์เรือธงที่มีการรองรับฮาร์ดแวร์ตั้งแต่ปี 2023+
ตัวถอดรหัสฮาร์ดแวร์คือชิปขนาดเล็กเฉพาะทาง (ASIC) ที่ออกแบบมาสำหรับการถอดรหัสโดยเฉพาะ ต่างจาก CPU ที่ดำเนินการถอดรหัสด้วยคำสั่งตามลำดับ บล็อกฮาร์ดแวร์ประมวลผลแมโครบล็อกแบบขนาน การใช้พลังงานของตัวถอดรหัสฮาร์ดแวร์ต่ำกว่า 5–10 เท่าเพราะชิปทำงานที่ความถี่ต่ำกว่าและไม่มีขั้นตอนไปป์ไลน์ที่ไม่จำเป็น
โปรไฟล์ (profile) กำหนดชุดอัลกอริทึมการบีบอัดที่ใช้โดยตัวเข้ารหัส: Baseline, Main, High ระดับ (level) กำหนดพารามิเตอร์สูงสุดของสตรีม: ความละเอียด บิตเรต ขนาดบัฟเฟอร์ สำหรับอุปกรณ์มือถือ แนะนำโปรไฟล์ High และระดับ 4.1–5.2 — ซึ่งเพียงพอสำหรับวิดีโอ 1080p–4K ด้วยการถอดรหัสฮาร์ดแวร์
บน Android ใช้ MediaCodecList เพื่อรับรายการโคเดกที่มีและตรวจสอบว่าโคเดกใดเป็นฮาร์ดแวร์ บน iOS ตรวจสอบการรองรับผ่าน CMVideoFormatDescription ด้วยโคเดกที่ระบุ — หาก VTDecompressionSessionCreate สำเร็จ แสดงว่าโคเดกได้รับการรองรับ สำหรับ AV1 บน Android ให้ตรวจสอบการมีอยู่ของโคเดก OMX.google.aomc.decoder หรือเวอร์ชันฮาร์ดแวร์ของมัน
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม