2

Android(MediaPlayer)で再生する1つのビデオの描画でフィルターを実行する必要があります。このフィルターは背景を透明にしますが、処理するバイトを読み取るにはどうすればよいですか? Androidはアルファチャンネルムービーを実行していないようです:(

カメラ プレビュー (AR) をオーバーレイする全画面表示にビデオを配置するには、これが必要です。そのため、映画の背景を透明にする必要があります。

私の考えは、MediaPlayer フレーム データ (ビットマップ データ) を NDK プロセスに送信し、処理されたビットマップを surfaceview に戻すことです。

PS: Android API8、ターゲット 2.2+

以下の私のコードに従ってください:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.SurfaceView;

public class MovieSurfaceView extends SurfaceView {

    public MovieSurfaceView(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas c) {
        super.onDraw(c);
    }

}

/** The main activity for the ImageTargets sample. */
public class ImageTargets extends Activity  implements SurfaceHolder.Callback
{
    private MovieSurfaceView mPreview;

    private MediaPlayer mMediaPlayer;

    private SurfaceHolder holder;

    private String videoPath = "/LAST.3g2";

    protected void onCreate(Bundle savedInstanceState)
    {
        DebugLog.LOGD("ImageTargets::onCreate");
        super.onCreate(savedInstanceState);
        initApplicationAR();
    }

    private void initApplicationAR()
    {        

        mPreview = new MovieSurfaceView(this);

        addContentView(mPreview, new LayoutParams(
            LayoutParams.FILL_PARENT,
            LayoutParams.FILL_PARENT));

        //        holder = mGlView.getHolder();
        holder = mPreview.getHolder();
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        holder.addCallback(this);
    }


    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {

    }


    @Override
    public void surfaceCreated(SurfaceHolder arg0) {
        mMediaPlayer = new MediaPlayer();

        mMediaPlayer.setDisplay(holder);

        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

        mMediaPlayer.setOnPreparedListener(new OnPreparedListener() 
        {
            public void onPrepared(MediaPlayer mp) 
            {
                mp.start();
            }
        }
        );

        mMediaPlayer.setOnCompletionListener(new OnCompletionListener() 
        {

            @Override
                public void onCompletion(MediaPlayer mp) 
            {
                mp.reset();
            }
        }
        );

        iniPlayer();
    }


    @Override
        public void surfaceDestroyed(SurfaceHolder arg0) 
    {
        // TODO Auto-generated method stub

    }  


}
4

2 に答える 2

1

ムービー フレームとカメラ フレームの両方を OpenGL に送信することをお勧めします。ムービー フレームでアルファ フィルターを選択する方法については説明していませんが、OpenGL を使用すると、シェーダーを使用して GPU に多くのフィルターを実装できます。

于 2012-09-29T16:52:35.940 に答える
1

NDK + OpenGL を使用するプレーヤーだけが必要な場合 (プレーヤーをコンパイルするときに rgb565 = 0 を設定すると、アルファ チャネルが有効になります)

http://code.google.com/p/dolphin-player/

今、私の問題の解決策は次のとおりです。

http://code.google.com/p/javacv/

import java.io.File;

import com.googlecode.javacv.CanvasFrame;
import com.googlecode.javacv.FFmpegFrameGrabber;

public class TestCV{

    public static void main(String[] args) throws Exception {

        File f = new File("input.mp4");
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(f);

        final CanvasFrame canvas = new CanvasFrame("My Image");

        canvas.showImage(grabber.grab());

    }
}

CameraPreview キャンバスでできるように、キャンバスをロックしてバイトを操作した後、

助けてくれたすべての人に感謝します。

于 2012-10-06T12:50:32.067 に答える