Technology

ความลับของ Media Encoder บน M1 Pro / Max

By Arnon Puitrakul - 01 กุมภาพันธ์ 2022 - 3 min read min(s)

ความลับของ Media Encoder บน M1 Pro / Max

หน้าหน้านี้เคยบอกไปก่อนแล้วว่า หนูจะเลิกเขียนเรื่อง Macbook Pro M1 Max แล้ว แต่เรื่องที่เจอเมื่อวานอดใจไม่ไหวจริง ๆ ที่จะมาเขียน เป็นเรื่องของ Media Engine ที่ Apple บอกว่า เขาใส่มาใน M1 Pro และ M1 Max ที่ทำให้เราคาดหวังมาก ๆ ว่า ถ้าเรา Encode Video แล้วมันจะเร็วส์ แรง ทะลุนรก ดั่งพี่ดอม แต่ ๆ เมื่อวาน มานั่งทำวีดีโอสอน ก็เลยได้ค้นพบเรื่องของการ Encode Video บน M1 Pro/Max ที่น่าสนใจมาให้อ่านกัน

M1 Pro/Max กับ Media Encoder

ในตัว M1 Pro และ Max ฝั่งของ Apple บอกว่า มันมาพร้อมกับ Media Engine ที่ทำให้เราสามารถต่อหน้าจอภายนอก (External Display) ได้มากกว่า 1 หน้าจอไปเลย นอกจากนั้น มันยังช่วยในเรื่องของการ เข้ารหัส (Encoding) และ ถอดรหัส (Decoding) ไฟล์ Video ต่าง ๆ โดยเฉพาะ Video ที่ใช้การเข้ารหัสแบบ ProRes ต่าง ๆ ที่เป็นวิธีการเข้ารหัสวีดีโอที่ใช้งานในระดับ Professional เพราะมันยังคงคุณภาพของตัวไฟล์ได้เหมือนเดิมทุกประการ

ถ้าใครที่ถ่ายรูปแล้วยังนึกภาพไม่ออก ProRes มันก็คล้าย ๆ กับเราถ่ายพวก RAW File เลย แต่แทนที่เราจะถ่ายรูปเดียว ทุก ๆ Frame มันเป็นเหมือนกับ RAW File หมดเลย ทำให้คุณภาพของไฟล์ยังคงอยู่แบบ 100% ไปเลย เหมาะกับการเอาไปทำในงานระดับ Production ที่ต้องการคุณภาพสูงเช่นการเอาไปทำ Colour Grading เป็นต้น

ซึ่งจากข้อมูลของ Apple บอกว่า ในตัว M1 Pro และ M1 Max มี Media Engine ที่สามารถเข้ารหัส และ ถอดรหัส แบบ H.264, HEVC, ProRes และ ProRes RAW ได้ โดยที่ M1 Pro จะมาพร้อมกับ Media Engine จำนวน 1 ชุด ประกอบด้วย Media Decoder, Encoder และ ProRes Encoder/Decoder อย่างละชุด ในขณะที่ M1 Max มากับ Media Engine จำนวน 2 ชุดด้วยกัน ประกอบด้วย Media Decoder 1 ชุด และ Media Encoder กับ ProRes Encoder/Decoder อย่างละ 2 ตัว

ทำให้ M1 Max ได้เปรียบเรื่องของการ Encode Video เป็นอย่างมากจากการที่มี Media Engine มากกว่า M1 Pro ถึง 1 ชุด และ M1 ปกติที่ไม่มี Media Engine แยกออกมาแบบ M1 Pro และ Max

M1 ไม่มี Media Engine แล้วจะ Encode & Decode Video ยังไงละ

ในเว็บของ Apple เอง ก็ไม่ได้บอกว่า M1 ปกติมันมี Media Engine อย่างไรอะไรบ้าง แต่ถ้าให้เราเดา มันน่าจะมีพวกคำสั่งสำหรับการทำ Hardware Decoding บ้างแล้วละ ทำให้เวลาเราใช้ M1 ในการเล่นวีดีโอมันน่าจะไม่ค่อยมีปัญหา แต่ถ้าเกิดมันไม่มีอย่างที่เราคิด มันก็ยังสามารถที่จะเล่นวีดีโอ และ Encode ได้ ผ่านการใช้งาน GPU หรือ CPU ได้เหมือนกัน แต่ถามว่าเร็วเท่ากับ Media Engine มั้ย เราก็มองว่า ไม่น่าจะเร็วเท่าขนาดนั้น เพราะ Media Engine เป็น Hardware ที่ออกแบบมาเฉพาะสำหรับงานประเภทนี้เลย

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

เราพอจะรู้ได้อย่างไรว่า Media Engine ทำงานแล้ว ?

โดยทั่ว ๆ ไปแล้ว ใน macOS มันไม่มี Software ตัวไหนที่แสดงค่า Utilisation การทำงานของ Media Engine แต่เรารู้ว่า มันน่าจะเข้ามาแบ่งเบาภาระของ GPU แน่นอน และ ถ้ามีการเล่นวีดีโอ จะต้องมีการ Decode เกิดขึ้น และ ถ้าเราสั่ง Export Video ต่าง ๆ จะต้องมีการ Encode เกิดขึ้น

ดังนั้น ถ้าเกิด เรากำลังเล่น Video อยู่ ถ้า Media Engine ไม่ทำงาน GPU Utilisation ที่เราสามารถเช็คได้จาก Activity Monitor ได้เลย ถ้า GPU มันขึ้นแบบเยอะมาก ๆ เราอาจจะอนุมานได้ว่า Media Engine อาจจะไม่ได้เข้ามารับโหลดซะทีเดียว โดยเฉพาะ ถ้าเรารัน Video แค่ 4K HDR เรามองว่า Media Engine น่าจะต้องเอาอยู่แน่ ๆ ถ้า GPU มันยังขึ้นได้เยอะ ๆ แปลว่า Media Engine ไม่น่าจะเข้ามาช่วย

กลับกัน ถ้าเรา Render Video เราคิดว่า GPU น่าจะต้องขึ้นแหละ เพราะบางที Video ที่เราทำมันจะมีพวก Colour Correction หรือ Effect ต่าง ๆ อยู่แล้ว พวกนี้มันต้องอาศัยพลังของ GPU ในการประมวลผล แต่ถ้าเราทำงานแค่ระดับ 4K เรามองว่า อย่าง M1 Max 32-Core GPU เรามันไม่น่าจะโหลดได้แบบ 100% แน่ ๆ น่าจะอยู่ในระดับเดียวกับที่เรานั่งทำงานบน Final Cut Pro X แล้วมันขึ้นอะไรแค่นั้น ดังนั้น เราเดาว่า ถ้าทำไฟล์แบบนี้แล้ว GPU เด้งสูงปรี๊ดเลยเราว่า มันไม่น่าจะใช่ Media Engine แบ่งไปทั้งหมดละ น่าจะมีอะไรบางอย่างที่ไม่ใช่แน่ ๆ

นอกจากนั้น เรายังสามารถใช้โปรแกรม powermetrics ที่มากับ macOS ในการตรวจสอบพวก Memory Activity ได้ หรือถ้าเราอยากให้มันอ่านง่ายมี Interface ที่ดีขึ้น เราอาจจะติดตั้ง asitop ได้ ทำให้เราอ่านได้ง่ายกว่าเดิมเยอะ

เราลองสังเกตว่า ถ้าเกิด เรามีการเล่นวีดีโอ โดยเฉพาะเมื่อเปิดวีดีโอระดับ 4K HDR ขึ้นไป หรือ มีการ Export วีดีโอตรง Media Memory Bandwidth มันจะวิ่งแบบนิ่ง ๆ เลย น่าจะเป็นตัว Confirm ได้ดีว่า มันน่าจะทำงานแล้วละ

เรื่องมันเป็นยังไง ไหนบอกหมอสิ๊

สิ่งที่ทำให้มันทำให้เราเกิดความสงสัยมาก ๆ เกิดจากเมื่อคืน เราทำการ Export วีดีโอลง Youtube ตามปกติ โดยวิธีการของเราคือการใช้คำสั่ง Send to Compressor บน Final Cut Pro X แล้วมาจัดการพวก Delivery Workflow บน Compressor ทั้งหมด เราก็เลือก Preset เป็น Up to 4K สำหรับ Youtube และ Facebook ที่ Compressor มันมีมาให้

หลังจากที่เรากด Start Batch ไปตามปกติ เราก็สังเกตว่า เอ๊ะ ทำไม GPU Utilisation ที่เราดูบน iStatMenu มันน้อยจังเลย เพราะก่อนหน้านี้ เรา Export Course เรียนของเรา มันก็โหลด GPU หนัก ๆ เลยนะ 91% ++ เลย แบบตลอดด้วย แล้วไฟล์วีดีโอ มันก็ Preset เดียวกันแน่นอน เพราะอัดมาจากที่เดียวกันเป๊ะ ๆ โดยที่ไม่ได้เปลี่ยนอะไรเลย หรือว่า เป็นเพราะว่า เราไม่ได้เสียบปลั๊กเหรอ แต่ก็ไม่น่าใช่ เพราะ Macbook Pro ใน Generation นี้ เสียบ กับ ไม่เสียบ Performance ไม่ต่างกัน

แต่เพื่อเป็นการทดสอบสมมุติฐานว่า การไม่เสียบปลั๊กมันไม่เกี่ยวจริง ๆ หลังจากเสร็จแบบที่ไม่เสียบปลั๊ก เราก็ทดลอง Export ไฟล์เดิม และ Preset เดิมทุกอย่าง แต่เสียบปลั๊กชาร์จ ซึ่งจากที่เห็นในรูป มันจะมีการ Export ไฟล์เดียวกันเลย ด้านล่างเป็นไม่ได้เสียบแบต และ อันบน เป็นอันที่เสียบแบตแล้ว จะเห็นได้ว่า เวลามันใกล้เคียงกันมาก ห่างกันไม่กี่วินาทีเท่านั้นเอง แปลว่า การไม่เสียบปลั๊กน่าจะไม่เกี่ยวละ ทำให้เรา Rule out เรื่องพลังงานละ ไม่น่าใช่

อันที่เป็น ขีด 4K ในแต่ละชุดคือเลือก Media Container เป็น MP4 กับอีกอันจะเป็นเลือกแบบ MOV และชุดบน จะเป็นไฟล์แบบที่ไม่ได้ตัดต่อ ไม่ได้เพิ่ม Effect และ Colour Correction ใด ๆ เลย ส่วนด้านล่าง คือ อันที่ตัดต่อเรียบร้อยแล้ว

นอกจากนั้น จากรูป ถ้าเราเอาในรอบเดียวกันคือ ใช้ Preset Up to 4K กับ 4K ของเราเอง เวลาห่างกันเยอะมาก ๆ คือ 38 นาที กับ 2 ชั่วโมง 28 นาที ห่างกัน 50 นาที เกือบชั่วโมงเลยนะ ไหนจะกินไฟเยอะกว่า ร้อนกว่าอีก โห แย่กว่าหมดเลยละ ตอนแรกบนชุดของ MP4 เราเข้าใจว่า หรือเป็นเพราะว่า เรามีเรื่องของ Colour Correction และ Effect ต่าง ๆ หว่า มันเลยช้าลง ปรากฏว่า เราลองดูที่เวลาในการ Export ของ MP4 ทั้ง 2 อันจะเห็นว่า อันที่เราใส่ Effect กินที่ 2 ชั่วโมง 29 นาที แต่อันที่ไม่ใช่กินอยู่ 2 ชั่วโมง 28 นาที ก็เรียกว่าเกือบ ๆ จะใกล้เคียงเลยละกัน

เพื่อเป็นการ Confirm อีกชั้น เราก็เลย เอา Course เรานี่แหละ ที่ตอนนั้น เรา Export แล้ว GPU มันโดดไป 91%++ ด้วย Preset Up to 4K ปรากฏว่า GPU ก็ไม่ขึ้น 91% เหมือนกัน แปลว่า เป็นที่ Preset แล้วแน่ ๆ

ตัว Config ของ Preset Up to 4K กับ อันที่เราใช้ในการ Export Course เราเอง มันมี Config บนเรื่องของ H.264 และ เสียง ที่เหมือนกันทั้งหมดเลย แต่ทำไมมันยังได้ไม่เหมือนกัน

เราเลยลองเอา Project ที่จะลง Youtube มา Export ผ่าน Preset ที่เรา Export Course ปรากฏว่า อ้าว GPU ก็วิ่ง 91% พอ ๆ กันกับวีดีโอสอนเลย งั้น Preset จริง ๆ แล้วละ จนสุดท้าย... มาตรัสรู้ว่า เห้ย เด่วนะ Media Container มันไม่เหมือนกัน

ฝั่งของ Up to 4K ที่ Compressor ทำมาให้มันใช้ MOV เป็น Container แต่ อันที่เราทำขึ้นมาเอง มันใช้ MP4 เป็น Container ทำให้มัน Export มาแล้วมีการใช้ Resource กับขนาดไม่เท่ากันอีก

ProRes ที่ Apple พูดนักเคลมหนา มันได้จริงมั้ย

ส่วนของ Media Engine ที่ Apple เคลมเดือดมาก ๆ คือ ProRes Encoder/Decoder ที่ใน M1 Max ใส่มาให้ถึง 2 ชุดเลย เขาบอกว่า ทำให้มันเร็วมาก ๆ เราเลยลองใช้ Compressor ของ Apple เองเลย ทำการ Encode วีดีโอแบบ MP4 H.264 บนความละเอียด 4K 30FPS 200 Mbps เป็น ProRes 422 ด้วย Preset ของ Compressor เอง

พอกด Encode เท่านั้นแหละ ยังกะพายุเข้า GPU วิ่ง 100% แต่เราจะสังเกตเห็นว่า มัน Utilised สูงจริง แต่ Clock Speed มันไม่ได้เยอะเลย อยู่หลักร้อยเท่านั้น แต่ สังเกตที่ Media Memory Bandwidth มันพุ่งเลย แปลว่าน่าจะมีอะไรให้มันทำงานอยู่แน่ ๆ ละ มันเลยมี Activity หนักได้ขนาดนั้น

ถามว่าเร็วกว่าเดิมมั้ย เราก็ตอบไม่ได้เหมือนกัน เพราะเราไม่มีเครื่องให้เปรียบเทียบเลยไว้ถ้าเราว่าง ๆ ไปหาเพื่อนที่มี Compressor แล้วจะมาเล่าอีกทีละกันว่ามันเร็วแรงได้ขนาดไหน หรือ จริง ๆ เราสามารถไปหาดูที่เขา Benchmark ได้ใน Youtube แต่ถ้าถามว่า มันเร็วมากพอที่เราจะทำงานได้อย่างรวดเร็วมั้ย คือเร็วพอเลยละ

MOV กับ MP4 เอาอันไหนดี ?

สำหรับเรา เรามองว่า ถ้าเราต้องการที่จะ Upload ลง Facebook หรือ Youtube หรือพวก Video Streaming Platform ต่าง ๆ เราว่า ใช้ MOV ที่เป็น Default ของ Apple เลยก็ได้ เพราะ เวลาในการ Render เร็วกว่าเยอะมาก ๆ แบบมาก ๆ จริง ๆ สำหรับ M1 Max ของเรา เพราะยังไง ๆ พวกนั้นเขาก็ Encode Video ที่เรา Upload ใหม่อยู่ดี ดังนั้น เราก็จะได้ MP4 อยู่แล้ว

แต่ถ้าเราบอกว่า เราไม่ได้เอาไปลงในพวกนั้นเลย คือ ไฟล์นั้นถูก Serve สด ๆ เลย เราจะยอมเสียเวลาในการ Encode ให้เป็น MP4 ดีกว่า เพราะ MP4 มันเป็น Media Container ที่เป็นมาตรฐานมากกว่า ทำให้ Support กับอุปกรณ์ได้หลากหลายกว่ามาก ๆ และขนาดส่วนใหญ่จะเล็กกว่าด้วย เลยทำให้เหมาะกับการเอามา Stream มากกว่าด้วย

กับอีกวิธีที่เราว่า น่าจะสนุกคือ ในเมื่อมัน Encode เป็น MP4 แล้วกินเวลานานแสนนาน เราก็อาจจะหาเครื่อง Windows สักตัว แล้วรันพวก Handbreak ไว้ แล้วก็ให้มัน Encode จาก MOV เป็น MP4 อีกทีก็ได้ แต่ถ้าทำแบบนั้นเราไม่รู้นะว่า คุณภาพมันจะลด หรือไม่ ส่วนตัวลองแล้ว มันก็ได้อยู่นะ คือถ้าเราไม่ได้ไปจี้ Zoom เข้าไปดูลึก ๆ เอาแบบดูปกติ มันก็ได้นะ

Handbreak รองรับ Media Engine มั้ย ?

อีกคำถามที่เราสงสัยเหมือนกัน คือ แล้วโปรแกรมแปลงไฟล์ฟรีอย่าง Handbreak ที่ใช้กันเยอะมาก ๆ มันรองรับ Media Engine ของพวก M1 Pro และ Max มั้ย เราก็เลยลองกับไฟล์ MP4 ไฟล์เดิมเลย เอามา Encode ใหม่ให้ Bitrate ลดจาก 200 Mbps เป็น 100 Mbps กับ กับ Passthrough เสียงออกไปเลย ดังนั้น คุณภาพเสียง และ การเข้ารหัส ไม่ต่างกัน

โดยที่ Encoder เราจะต้องเลือกเป็น ตัวที่มีวงเล็บด้านหลังว่า VideoToolBox จะเลือกเป็น h.264 หรือ h.265 ก็ขึ้นกับความต้องการของเราได้เลยว่า เราต้องการแบบไหน ส่วนตัวเราก็จะทำงานกับพวก h.264 ซะเยอะ

จากการทดลอง เราก็จะเห็นได้เลยว่า Memory Bandwidth ตรงฝั่งของ Media มันมี Activity ขึ้นมา กับ GPU ก็แทบไม่ทำงานเลย มีแค่ CPU ที่ทำงานขึ้นมา 400 - 500% แบบ UNIX ก็กลาง ๆ เลยเดาว่า ตัว Handbreak มันก็น่าจะรับการใช้งาน Media Engine อยู่ สำหรับเครื่องที่ไม่มี ตัว VideoToolBox มันจะ Fallback ไปใช้ GPU แทน อันนี้เราลองแล้วตอนที่เราใช้งาน iMac 27-inch 2019 ก็ถือว่าเร็วอยู่เหมือนกัน แต่ M1 Max เร็วกว่าเยอะ

สรุป

Media Engine ที่เราคาดหวังว่า จะเอามาใช้ในการ Export Video Course ของเรา สรุปก็คือ หมา จ๊ะ เพราะ เราต้อง Export โดยใช้ Media Container แบบ MP4 ที่ Media Engine ไม่ได้ Offload ทั้งหมด ทำให้ GPU มันต้องทำงานซะเยอะ และใช้เวลานานกว่าการเลือกใช้ MOV Container หลายเท่าตัวเลย อันนี้เราไม่แน่ใจว่า เป็นเพราะ Hardware มันทำได้เท่านี้ หรือ ว่ามันเป็นเรื่องของ Software หรือ เราอาจจะตั้ง Preset ผิดกันแน่ ดังนั้น ตอนนี้สำหรับใครที่คิดว่าจะเอามา Encode Video แบบ MP4 อาจจะต้องคิดถึงเรื่องนี้หน่อย เราว่าถ้าทำทุกวันจริง ๆ การใช้พวก Encoder ของ NVENC น่าจะตอบโจทย์กว่ามาก ๆ เลยละ