新しい API MediaCodec を使用しています。デコードされたビデオ フレームを取得し、スケジュール時にサーフェスにレンダリングしたいと考えています。これで、エミュレーターでコードを正しく実行し、ビデオ フレーム フォーマットを次のように取得できます。
{height=192, what=1869968451, color-format=19, slice-height=192, crop-left=0, width=320, crop-bottom=179, crop-top=0, mime=video/raw, stride=320, crop-right=319}
しかし、nexus 4 でコードを実行すると、ビデオ フレーム形式が次のように変更されます。
{height=180, what=1869968451, color-format=2141391875, slice-height=192, crop-left=0, width=320, crop-bottom=179, crop-top=0, mime=video/raw, stride=384, crop-right=319}
カラー形式 2141391875 が何であるか、高さが 192 でない理由がわかりません。興味深い問題は、configure 関数を から に変更するcodec.configure(format, surface /* surface */, null /* crypto */, 0 /* flags */)
とcodec.configure(format, null/* surface */, null /* crypto */, 0 /* flags */)
、出力バッファの長さが 0 から 114688 に変更されることです。しかし、実際には、フレーム形式が YUV420p (320*192*1.5) の場合、正しいバッファ長は 92160 である必要があります。エミュレータで実行すると、出力フォーマットが変更される前に出力バッファが変更されていることがわかりました。しかし、nexus 4 で実行してもそれは変わりませんでした。ログは次のように表示されます。
03-26 14:42:38.466: I/VideoPlayTAG(1212): count=0
03-26 14:42:38.476: I/VideoPlayTAG(1212): sampleSize:700
03-26 14:42:38.496: D/VideoPlayTAG(1212): next:true
03-26 14:42:38.496: I/VideoPlayTAG(1212): output index:-3
03-26 14:42:38.566: D/VideoPlayTAG(1212): output buffers have changed.
03-26 14:42:38.566: I/VideoPlayTAG(1212): count=1
03-26 14:42:38.566: I/VideoPlayTAG(1212): sampleSize:140
03-26 14:42:38.596: D/VideoPlayTAG(1212): next:true
03-26 14:42:38.596: I/VideoPlayTAG(1212): output index:-2
03-26 14:42:38.686: D/VideoPlayTAG(1212): color=19 width=320 height=192
03-26 14:42:38.686: I/JNI(1212): begin setRender 1734
03-26 14:42:38.686: I/JNI(1212): setRender
03-26 14:42:38.716: D/VideoPlayTAG(1212): output format has changed to {height=192, what=1869968451, color-format=19, slice-height=192, crop-left=0, width=320, crop-bottom=179, crop-top=0, mime=video/raw, stride=320, crop-right=319}
03-26 14:42:38.716: I/VideoPlayTAG(1212): count=2
nexus 4 の場合:
03-26 10:17:59.674: I/VideoPlayTAG(29899): count=0
03-26 10:17:59.684: I/VideoPlayTAG(29899): sampleSize:700
03-26 10:17:59.684: D/VideoPlayTAG(29899): next:true
03-26 10:17:59.694: I/VideoPlayTAG(29899): output index:-1
03-26 10:17:59.694: I/VideoPlayTAG(29899): count=1
03-26 10:17:59.704: I/VideoPlayTAG(29899): sampleSize:140
03-26 10:17:59.704: D/VideoPlayTAG(29899): next:true
03-26 10:17:59.704: I/VideoPlayTAG(29899): output index:-1
03-26 10:17:59.714: I/VideoPlayTAG(29899): count=2
03-26 10:17:59.714: I/VideoPlayTAG(29899): sampleSize:131
03-26 10:17:59.714: D/VideoPlayTAG(29899): next:true
03-26 10:17:59.724: I/VideoPlayTAG(29899): output index:-1
03-26 10:17:59.724: I/VideoPlayTAG(29899): count=3
03-26 10:17:59.724: I/VideoPlayTAG(29899): sampleSize:59
03-26 10:17:59.724: D/VideoPlayTAG(29899): next:true
03-26 10:17:59.724: I/VideoPlayTAG(29899): output index:-2
03-26 10:17:59.744: D/VideoPlayTAG(29899): color=2141391875 width=320 height=180
03-26 10:17:59.744: I/JNI(29899): begin setRender 1734
03-26 10:17:59.744: I/JNI(29899): setRender
03-26 10:17:59.744: D/VideoPlayTAG(29899): output format has changed to {height=180, what=1869968451, color-format=2141391875, slice-height=192, crop-left=0, width=320, crop-bottom=179, crop-top=0, mime=video/raw, stride=384, crop-right=319}
03-26 10:17:59.744: I/VideoPlayTAG(29899): count=4
誰でも私を助けることができますか?この問題は、ソフトウェア レンダーとハードウェア レンダーの違いが原因である可能性があることがわかりました。