VideoToolboxを弄り回しており、流れてくる入力ストリームをVTCompressionSessionFrameEncoderにぶち込み、H.264を得たい。
一応その流れはできたが、とんでもない勢いでVTEncoderXPCServiceがブン回りはじめる。
これ、HWエンコーダー使われてるのかな・・・それ以前に積んでるよね?よね?
というのを調べるべく、VideoToolboxのAPIを叩いて確認することになった。
VTCopyVideoEncoderList(::)APIだ。
よし調べたろ! という段階でつまづいた。
VideoToolboxは低レベルAPI系なので、ObjCでいうArrayRefなどのRef系を多様する。Swiftでどうやってやんねんそれ・・・というわけでその問題を解消するべく、自分のMacが対応しているエンコーダーの一覧を出すものを書いてみた。
Playgroundでも動くので試してみていただきたい。
import Cocoa
import VideoToolbox
let list = UnsafeMutablePointer<CFArray?>.allocate(capacity: 1)
VTCopyVideoEncoderList(nil, list)
print(list.pointee)
うちのでは以下のような結果になった。
お、Apple HEVC (HW)はいってるやん!!(当たり前)。いつか利用したい。
もしHEVC(SW)しかない人はそろそろ買い直しも検討にいれてみてはどうか。
参考URL: (あっぷるちゃんねる)https://applech2.com/archives/20170626-hevc-hw-sw-acceleration-mac.html
MacBook Pro (15-inch, 2017)では以下のような結果になる
Optional(<__NSArrayM 0x7fa8c7426650>(
{
CodecName = "24-bit RGB";
CodecType = 24;
DisplayName = "24-bit RGB";
EncoderID = "com.apple.videotoolbox.videoencoder.24rgb";
EncoderName = "Apple 24-bit RGB";
},
{
CodecName = "32-bit ARGB";
CodecType = 32;
DisplayName = "32-bit ARGB";
EncoderID = "com.apple.videotoolbox.videoencoder.32argb";
EncoderName = "Apple 32-bit ARGB";
},
{
CodecName = "Apple ProRes 422";
CodecType = 1634755438;
DisplayName = "Apple ProRes 422";
EncoderID = "com.apple.videotoolbox.videoencoder.prores422";
EncoderName = "Apple ProRes 422";
},
{
CodecName = "Apple ProRes 422 HQ";
CodecType = 1634755432;
DisplayName = "Apple ProRes 422 HQ";
EncoderID = "com.apple.videotoolbox.videoencoder.prores422hq";
EncoderName = "Apple ProRes 422 HQ";
},
{
CodecName = "Apple ProRes 422 LT";
CodecType = 1634755443;
DisplayName = "Apple ProRes 422 LT";
EncoderID = "com.apple.videotoolbox.videoencoder.prores422lt";
EncoderName = "Apple ProRes 422 LT";
},
{
CodecName = "Apple ProRes 422 Proxy";
CodecType = 1634755439;
DisplayName = "Apple ProRes 422 Proxy";
EncoderID = "com.apple.videotoolbox.videoencoder.prores422proxy";
EncoderName = "Apple ProRes 422 Proxy";
},
{
CodecName = "Apple ProRes 4444";
CodecType = 1634743400;
DisplayName = "Apple ProRes 4444";
EncoderID = "com.apple.videotoolbox.videoencoder.prores4444";
EncoderName = "Apple ProRes 4444";
},
{
CodecName = "H.263";
CodecType = 1748121139;
DisplayName = "H.263";
EncoderID = "com.apple.videotoolbox.videoencoder.h263";
EncoderName = "Apple H.263";
},
{
CodecName = "H.264";
CodecType = 1635148593;
DisplayName = "Apple H.264 (HW)";
EncoderID = "com.apple.videotoolbox.videoencoder.h264.gva";
EncoderName = "Apple H.264 (HW)";
},
{
CodecName = "H.264";
CodecType = 1635148593;
DisplayName = "Apple H.264 (SW)";
EncoderID = "com.apple.videotoolbox.videoencoder.h264";
EncoderName = "Apple H.264 (SW)";
},
{
CodecName = HEVC;
CodecType = 1752589105;
DisplayName = "Apple HEVC (HW)";
EncoderID = "com.apple.videotoolbox.videoencoder.hevc.gva";
EncoderName = "Apple HEVC (HW)";
},
{
CodecName = HEVC;
CodecType = 1752589105;
DisplayName = "Apple HEVC (SW)";
EncoderID = "com.apple.videotoolbox.videoencoder.hevc.vcp";
EncoderName = "Apple HEVC (SW)";
},
{
CodecName = JPEG;
CodecType = 1785750887;
DisplayName = JPEG;
EncoderID = "com.apple.videotoolbox.videoencoder.jpeg";
EncoderName = "Apple JPEG";
}
))