私はチャットを開発しており、拡張子が mp4 の高品質の顔文字 (ファイル サイズは約 300kb) があります。GIF 形式は、品質が低く、色が限られているため (256) 使用されません。
ListView 内のファイルを循環ビデオとして表示する必要があります。現在、TextureView および MediaCodec クラスを使用してこれを実行しようとしています。ソースはhttps://github.com/google/grafikaにあります。
問題は、4 つ以上のビデオを同時に再生しようとすると、 android.media.MediaCodec.dequeueOutputBuffer でエラー
IllegalStateExceptionが発生することです。これは、私のデバイス (HTC ONE M7) で 4 つのビデオを再生しているときに、メモリの消費量が多いために発生すると考えられます。プロセッサの負荷は 60% を超えています。
どうすればこの問題を解決できますか? たぶん、サードパーティのコーデックを使用する必要がありますか?
または、ビデオを使用してスマイリーを表示するという考えは良くなく、あきらめて GIF のようなものを使用する必要がありますか?
質問する
1003 次
1 に答える
1
ある時点でハードウェアの最大帯域幅を超える以外の理由がない場合、同時デコーダーの数には制限があります。一部のデバイスでは、2 つのハードウェア デコーダーが構成された後、ソフトウェア デコードに切り替わるのを見てきました。私の知る限り、ここには強制された動作はありません。
問題の解決策の 1 つは、すべての絵文字を 1 つの .mp4 ファイルにまとめた単一のマルチプレックス ビデオを用意することです。それを SurfaceTexture に再生し、「スプライト シート」として使用します。このアプローチでは、すべてのアニメーションのフレーム数がほぼ同じである必要があるため、一部を調整するか、シーケンスをパディングする必要がある場合があります。
更新:このリンクによると、「M」リリースが追加される予定で、MediaCodecInfo.CodecCapabilities.getMaxSupportedInstances()
「サポートされている同時コーデック インスタンスの最大数のヒント」を提供します。問題の解決にはあまり役立ちませんが、少なくとも数字はわかります。API がビデオの解像度を考慮してくれることを願っています。
于 2014-11-21T16:50:14.057 に答える