12

だから私はVideoViewのスクリーンショットをやろうとしています。最も簡単な方法は次のとおりだと思いました。

videoView.setDrawingCacheEnabled(true);

次に、スクリーンショットを撮る必要がある場合:

Bitmap screenshot = videoView.getDrawingCache();

しかし、何らかの理由で、私が返すビットマップは毎回黒です。誰でもこれで成功しましたか?私も試しました:

Bitmap bitmap = Bitmap.createBitmap(videoView.getWidth(), videoView.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
videoView.draw(canvas);

しかし、もう一度、これは私に黒い画像を返します. VideoView が Android の javadoc にほとんど記載されていないことがわかります。何か助けはありますか?

4

2 に答える 2

13

View#setDrawingCacheEnabledのドキュメントから:

描画キャッシュを有効にすることは、ハードウェア アクセラレーションがオフになっているときにレイヤーを設定することに似ています。ハードウェア アクセラレーションがオンになっている場合、描画キャッシュを有効にしてもレンダリングには影響しません。これは、システムがフラグを無視する別のメカニズムをアクセラレーションに使用するためです。ハードウェア アクセラレーションが有効になっている場合でも、ビューにビットマップを使用する場合は、setLayerType(int, android.graphics.Paint) を参照して、ソフトウェア レイヤーとハードウェア レイヤーを有効にする方法を確認してください。

VideoView がハードウェア アクセラレーションで動作し、キャッシュ メカニズムをバイパスしている可能性があります。優れたソース ダイブは、いくつかの光を当てる可能性があります。

編集-この投稿はいくつかの問題を解決しているようです:

申し訳ありませんが、SurfaceView はその性質上、通常のビュー階層更新システムでは描画されないため、描画されません。

(VideoView は SurfaceView の子です)

于 2011-03-11T22:10:08.673 に答える
0

API 10 以降、MediaMetadataRetrieverを使用して、特定の時間 (マイクロ秒単位) にフレームを取得できます。サンプルコードは次のとおりです。

public Bitmap videoFrame(String uri, long msec) {       
    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    try {                       
        retriever.setDataSource(uri);            
        return retriever.getFrameAtTime(msec);
    } catch (IllegalArgumentException ex) {
        ex.printStackTrace();
    } catch (RuntimeException ex) {
        ex.printStackTrace();
    } finally {
        try {
            retriever.release();
        } catch (RuntimeException ex) {
        }
    }
    return null;
}
于 2012-10-28T09:48:17.917 に答える