Technology

ความลับของ Media Engine ได้เปิดเผยแล้ว ทำไมถึงเจอปัญหา Encode ช้า

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

ความลับของ Media Engine ได้เปิดเผยแล้ว ทำไมถึงเจอปัญหา Encode ช้า

หลังจากตอนก่อน เรามาเล่าเรื่องที่เราพยายามที่จะใช้ Compressor ที่เป็นโปรแกรมของ Apple เองในการ Export Final Cut Pro X ออกมาเป็น Video แบบ MP4 สำหรับการเอาไป Upload ลงใน Video Streaming Service ทั้งหลาย แล้วเราเจอปัญหาว่า ทำไมมันใช้พลังของ GPU เกินกว่าที่เราคิดไว้ และ เครื่องระดับอย่าง M1 Max ที่เราใช้มันไม่น่าจะช้าขนาดนี้ ทำให้การสืบหาคนร้ายจึงเกิดขึ้น ลองกลับไปอ่านตอนก่อนได้

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

การสืบหายังคงดำเนินต่อไป

หลังจากตอนก่อน เราก็ยังไม่ละความพยายาม เพราะเราจะต้อง Export Video อีกเยอะมาก ๆ ในปีนี้ และความแตกต่างของเวลาในการ Export เรียกได้ว่าต่างกันราวฟ้ากับเหวเลยก็ว่าได้ ทำให้ยังไง เราก็ต้องหาให้ได้

เราลองไปหาในอินเตอร์เน็ต เราก็ยังไม่เจอคนที่ออกมาเล่าเรื่องนี้เลย คิดว่า เออ มันน่าจะมีคนที่เจอแบบเราบ้างดิ ปรากฏว่า เราก็พยายามไปนั่งหาอยู่ สุดท้าย เราก็ไม่เจอ เลยไปนั่งดูพวก Tutorial ที่สอนใช้ Compressor และการสร้าง Preset สำหรับ Export Video สำหรับ Youtube ดู เราก็เจอ เป็นอันด้านบน ที่ใช้ Preset คล้าย ๆ เราเลย

เราเลยลองค่อย ๆ เปลี่ยน Settings ลงไปเรื่อย ๆ ทีละอันเลย แล้วลองสังเกตที่ Activity ของ Memory Bandwidth ของ Media ที่เราดูผ่าน asitop ว่าอันไหนที่ทำให้ มันมี Activity วิ่งเยอะมาก ๆ และ GPU Utilisation ไม่วิ่งแบบบ้าคลั่งเหมือนก่อนหน้า

ตอนแรก เราคิดว่า หรือว่าเป็นเพราะว่า เราไปกำหนดพวกวิธีการ Resize และ Padding ที่ใช้คุณภาพสูง ๆ เลย ทำให้มันกินเครื่องอยู่พอสมควร เราก็ลองปรับไป ก็ไม่หาย ก็ยังเป็นเหมือนเดิมอยู่ ก็แหงแหละ เพราะเราไม่ได้ย่อ หรือขยาย Frame เลย โดยเฉพาะตัวที่เป็น 4K เพราะเราถ่ายมาเป็น 4K แล้ว Publish เป็น 4K หมดเลย ก็ไม่น่ามีปัญหาตรงนี้ได้เลย

หรือว่า เป็นเพราะ Allow Frame Reordering ที่เป็นการอนุญาติให้ Compressor เข้าไป Compress แต่ละ Frame ใหม่เพื่อที่จะทำให้เราได้ประสิทธิภาพในการบีบอัดสูงสุด ปรากฏว่า ก็ไม่หายอยู่ดี สุดท้าย เราลองไปเรื่อยเลย เรียกได้ว่า เกือบจะทุก Option เลยจนมาเจอนี่ละ

Frame Rate นังทัวร์ดีย์

จน เราปรับมาถึง Frame Rate นี่ละ เจอเลย เราปรับ Frame Rate จากเดิม 29.97 เป็น Automantics แล้วพอ Start ไป GPU Usage มันลงเลยไปถึง 73% แล้วก็ Clock Speed ของ GPU จากเดิมที่วิ่งอยู่ 1200 MHz กว่า ๆ ก็เหลือแค่ 700-900 MHz เท่านั้นเอง กับ เราจะเห็นว่า ตรง Memory Activity ของ GPU ก็ไม่ได้เป็นหลักร้อยเหมือนก่อนหน้านี้แล้ว แต่ตรง Media ที่เป็นส่วนของ Media Engine มันมี Activity ที่เยอะขึ้น แปลว่า Media Engine มันทำงานได้เต็มมากขึ้นอีก

พอ GPU ทำงานน้อยลง Media Engine ที่ประหยัดไฟกว่าเข้ามาทำงานด้วย เลยทำให้ การใช้พลังงานน้อยลงมาก ดูที่ตรง Package Power ลดลงไปเยอะมาก ๆ เหลือแค่ 28W กว่า ๆ เท่านั้นเอง จากเดิมที่กดไป 50-60W ถือว่าดีขึ้นเอยะเลย

เพื่อ มันอาจจะบังเอิญในครั้งนี้รึเปล่า เราเลยลองปรับ Frame Rate กลับไปที่ 29.97 อีกรอบ ปรากฏว่า GPU ก็กลับมาทำงานแบบโหมกระหน่ำเหมือนเดิม อาการเดิมเลย กับเพื่อความมั่นใจขึ้นอีก เราก็ลองปรับเป็น 60 Frame ก็เจออาการเดียวกันเลย (Footage อยู่ที่ 30 FPS)

ถามว่า การที่เรามานั่งเสียเวลาหาโจรในครั้งนี้ มันคุ้มค่าขนาดไหน เราเทียบอยู่ที่ด้านบน อันแรกจะเป็น Preset ของ Compressor เองที่สำหรับ Upload ขึ้น Youtube และ Facebook อันนั้นใช้ MOV Container กินไป 4 นาที 14 เทียบกับ เราปรับ Frame Rate ใหม่ กลายเป็น 1 นาที 8 วินาที อิดอกส์ เอาให้สุดกว่านั้นอีกคือ ถ้าเราใช้ Preset เดิมเลย คืออันสุดท้าย โดนไป 9 นาที 23 วินาที รวม ๆ คือ ห่างจากอันที่แก้แล้ว 8 นาทีกว่า ๆ เลย เยอะมากนะ เดือดมาก

เราเดาว่า ที่ GPU มันดันโหดขนาดนั้น เป็นเพราะว่า ตัว Frame Rate ของ Footage เราคือ 30 FPS เป๊ะ ๆ ที่อัดจาก OBS แล้วเราไปเซ็ตให้มันเป็น 29.97 Frame/sec ทำให้ มันน่าจะต้อง Interpolate Frame ทำให้มันกิน GPU เดือดมาก ๆ ซึ่งมันเร็วไม่เท่ากับ Media Engine มันพยายามจะเอา Frame ไป Compress ด้วย เราเลยเจอว่า Media Engine มันน่าจะทำงานเบามาก ๆ เพราะไปคอขวดที่ GPU นั่นเอง

นอกจากนั้น เราก็ยังลองเอาไป Encode เป็น ProRes 422 และ 4444 ด้วย ก็อย่างที่เห็นเลยว่า เร็วมาก ๆ เมื่อเทียบกับตอนเราเอามา Encode เป็น MP4 มันเร็วกว่ากันเยอะมาก ๆ นั่นแปลว่า ตอนที่เรา Encode เป็น MP4 จริง ๆ คอขวดน่าจะอยู่ที่ Media Engine ละ เพราะใน M1 Pro และ Max มันมี ProRes Encoder/Decoder อยู่ด้วย ทำให้มันทำงานได้โคตรเร็วเลย ถ้า Apple ใส่พวก H.264 Encoder ได้เท่ากับ ProRes นะเราว่า โหดฟุด ๆ เลย

ดังนั้น ถ้าเราเอา Original Footage ไป Encode ตัว GPU มันไม่น่าจะต้องมี Activity เยอะเลย เพราะก่อนหน้านี้ที่ GPU ต้องทำงานเป็นเพราะเรามีพวก Colour Correction กับพวก Effect ต่าง ๆ ทำให้ GPU ต้องมาจัดการ แต่พอมันเป็นไฟล์ธรรมดา GPU ก็ไม่น่าจะต้องทำงานเยอะละ ตัว Media Engine ที่ต้องเต็ม ๆ เลย ซึ่งเราลองกับ Preset ที่แก้เรื่อง Frame Rate แล้ว ปรากฏว่า ก็ใช่อย่างที่คิดเลย ตัว GPU แทบไม่ทำงานเลย เราว่าที่มันวิ่งอยู่คือ มันต้องขับจอ 4K ทั้งหมด 2 จอ แต่ Media Engine คือทำงานแบบรัว ๆ เลย งั้น Assumption ของเราน่าจะถูกต้องแล้วละ

เพื่อเป็นการทดสอบอีกรอบ เราก็เลยใช้ Preset เก่า กับ Original Footage เดียวกันเลย ปรากฏว่า ใช่ เวลาก็ต่างจริง ๆ เมื่อเทียบกับตอนที่เรา Export Version ที่มี Effect แล้ว เวลามันก็ลดลงไปแหละ โดยเฉพาะตัวที่เป็น Preset เก่าที่มันกิน GPU อยู่แล้ว คิดว่า เป็นเพราะ ตอนที่เรา Render Video จริงมันก็มี Effect แหละมันก็กิน GPU อยู่แล้ว ประกอบกับ Frame Interpolation อีก มันก็เลย ทำให้หนักเข้าไปใหญ่ พอ Process ของการ Render Effect มันหายไป มันก็ทำให้เวลามันหายไปอีก

ส่วนของ ProRes เราจะเห็นว่า ถ้าเราเอา ProRes เลย แล้วเราเปลี่ยน Frame Rate เหมือนกับตัว Preset เก่า ไหงมันเร็วกว่า อันที่ไม่เปลี่ยน Frame Rate ฟร๊ะ อันนี้ งง จริงยังหาคำตอบไม่ได้เหมือนกันว่าทำไม

Compressor Settings for YouTube

สุดท้าย ทำให้เราได้ Preset ที่เหมาะกับ Youtube และทำให้ M1 Max ของเรา Render ได้อย่างรวดเร็วกว่าเดิมมาก ๆ ใช้เครื่องน้อยลงมาก ๆ พวก Recommend Settings ที่ Youtube เองเขาก็มีมาให้เราเลย โดยเราสามารถเข้ามาดูได้ที่ ลิงค์นี้

ซึ่งเราก็จะเห็นว่า Media Container ที่แนะนำก็จะเป็น MP4 เราก็เลือกใน Compressor ได้เลยว่าจะเอา MPEG-4 ที่สำคัญ เลือก Codec เป็น H.264 ด้วยเด้อ ถ้าเลือก H.265 Youtube ก็ Upload ได้แหละ แต่น่าจะ Process ช้า ส่วน Bitrate ดูจากตารางด้านบนได้เลย ขึ้นกับความละเอียดที่เราใช้งานเลย สำหรับเราก็จะกด 4K ที่ 45 Mbps และ 1080p ที่ 8 Mbps เท่านั้นพอแล้ว ส่วนเรื่องเสียงเลือกเป็น AAC 96kHz เพื่อให้เราได้คุณภาพสูงที่สุดเท่าที่จะเป็นไปได้ เท่านี้ เราก็จะได้ Preset ที่เหมาะกับ Youtube แล้วนั่นเอง

สรุป

จากปัญหาที่เราเจอมา ไม่ได้เป็นเพราะ Media Container เหมือนตอนก่อนหน้านี้ เราก็คิดอยู่แหละว่า มันเป็นแค่เหมือนกล่อง แล้วทำไมมันมีปัญหาได้ เหมือน Something didn't added up อะไรแบบนั้นเลย จนมาโป๊ะนี่แหละ ว่าอ้าว เราเองนี่แหละโป๊ะเองว่ามันเป็นเพราะ Frame Rate ที่ต่างกันทำให้มันเกิดเรื่องแบบนี้ขึ้น ทำให้เราคิดว่า ถ้าเราจะถ่ายวีดีโอมา แล้วอยากทำงานเร็ว ๆ เราว่าน่าจะถ่ายโดยใช้ Frame Rate เดียวกันมาเลย น่าจะทำให้ Process ได้เร็วกว่าเยอะมาก ถ้าเราเปลี่ยน มันน่าจะเดือดอยู่ จากที่เราลองให้ดูที่ผ่านมานั่นเอง ก็ถือว่าเป็นการเรียนรู้ละกัน เพราะเราก็ยังมือใหม่ในเรื่องนี้เหมือนกัน ถ้าใครมีแนะนำก็บอกมาได้เลยนะฮ่ะ