2012-09-29 56 views
2

我需要在Android(MediaPlayer)上播放一個視頻的繪製過濾器,這個過濾器只是將背景變成透明的,但我如何讀取要處理的字節?由於Android似乎不跑alpha通道電影:(如何在MediaPlayer上使用SurfaceView應用濾鏡?

我需要這把視頻全屏覆蓋相機預覽(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 

    } 


} 

回答

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帆布做的工作,

感謝所有誰幫助,

1

我會建議發送電影幀和相機幀到OpenGL。你不會解釋你將如何選擇電影幀上的alpha濾鏡,但使用OpenGL,你可以在GPU上用shader實現很多濾鏡。

+0

的問題是Android的目標隊友,我不能用表面紋理的視頻幀發送到OpenGL,一些替代電影幀的紋理? – GTSouza

+0

你說得對,使用SurfaceTexture就容易多了,但我在2.2上實現了類似的任務。我使用相機預覽回調,glTexSubImage2D和着色器將yuv轉換爲rgb。 –

+0

相機可以,但關於視頻文件? mp4,3gp等,你怎麼知道一些技巧發送到當前幀到OpenGL? – GTSouza