【问题标题】:How apply a filter on MediaPlayer using a SurfaceView?如何使用 SurfaceView 在 MediaPlayer 上应用过滤器?
【发布时间】:2012-09-29 16:35:22
【问题描述】:

我需要对在 android (MediaPlayer) 上播放的一个视频执行过滤器,这个过滤器只会将背景变为透明,但我如何读取要处理的字节?因为android似乎不运行alpha通道电影:(

我需要它来全屏播放视频,覆盖相机预览 (AR)。这就是为什么我需要透明的电影背景。

我的想法是将 MediaPlayer 帧数据(位图数据)发送到 NDK 进程,然后将处理后的位图返回到表面视图。

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

    }  


}

【问题讨论】:

    标签: android android-ndk android-mediaplayer


    【解决方案1】:

    我建议将电影帧和相机帧都发送到 OpenGL。您没有解释如何在电影帧上选择 alpha 过滤器,但使用 OpenGL,您可以使用着色器在 GPU 上实现许多过滤器。

    【讨论】:

    • 问题出在 android 目标伴侣上,我无法使用 SurfaceTexture 将视频帧发送到 openGL,是否有其他方法可以将电影帧转为纹理?
    • 你说得对,使用 SurfaceTexture 更容易,但我在 2.2 上实现了类似的任务。我使用相机预览回调、glTexSubImage2D 和着色器将 yuv 转换为 rgb。
    • 相机没问题,但是关于视频文件? mp4、3gp 等,你怎么知道将当前帧发送到 openGL 的一些技巧?
    • 我使用的是基于 ffmpeg 的自定义视频解码器。但是你不能从 onDraw 中取出 Canvas
    • 你能和我分享一下吗?在您的自定义视频解码器上,您可以处理电影的帧吗?我的意思是,发送到openGL的东西?谢谢,
    【解决方案2】:

    如果您只需要使用 NDK + OpenGL 的播放器(编译播放器时设置 rgb565 = 0,这将启用 alpha 通道)

    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 画布上做的那样,

    感谢所有帮助的人,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 2020-01-17
      相关资源
      最近更新 更多