ffmpeg教程java_ffmpeg超详细综合教程

本文档是一篇关于如何在Java中利用ffmpeg进行视频处理的详细教程,通过创建一个Android应用,展示了如何捕获相机预览帧,并使用ffmpeg进行编码操作。主要涉及Camera API的使用,AsyncTask的实现以及与ffmpeg的交互。
摘要由CSDN通过智能技术生成

packagecom.zhanghui.test;
importjava.io.IOException;
importandroid.annotation.TargetApi;
importandroid.app.Activity;
importandroid.content.pm.PackageManager;
importandroid.hardware.Camera;
importandroid.os.AsyncTask;
importandroid.os.Build;
importandroid.os.Bundle;
importandroid.util.Log;
importandroid.view.Menu;
importandroid.view.MenuItem;
importandroid.view.SurfaceHolder;
importandroid.view.SurfaceView;
importandroid.view.View;
importandroid.widget.Button;
importandroid.widget.Toast;
@SuppressWarnings("deprecation")
publicclassMainActivityextendsActivity {
privatestaticfinalString TAG="MainActivity";
privateButton mTakeButton;
privateCamera mCamera;
privateSurfaceView mSurfaceView;
privateSurfaceHolder mSurfaceHolder;
privatebooleanisRecording =false;
privateclassStreamTaskextendsAsyncTask{
privatebyte[] mData;
//

构造函数
        StreamTask(byte[] data)

{
            this.mData = data;
        }
        @Override
        protected Void doInBackground(Void... params) {   
            // TODO Auto-generated method stub
         if(mData!=null){
            Log.i(TAG, "fps: " + mCamera.getParameters().getPreviewFrameRate());         
            encode(mData);
            }
          return null;
        }        
    }   
 private StreamTask mStreamTask;
    @Override
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Camera.PreviewCallback mPreviewCallbacx=new Camera.PreviewCallback() {
            @Override
           public void onPreviewFrame(byte[] arg0, Camera arg1) {
              // TODO Auto-generated method stub
               if(null != mStreamTask){
                       switch(mStreamTask.getStatus()){
                        case RUNNING:
                           return;
                     case PENDING:                                    
                           mStreamTask.cancel(false);                      
                            break;                      
                        }
                   }
                mStreamTask = new StreamTask(arg0);
                 mStreamTask.execute((Void)null);
           }
       };
        mTakeButton=(Button)findViewById(R.id.take_button);
        PackageManager pm=this.getPackageManager();
        boolean hasCamera=pm.hasSystemFeature(PackageManager.FEATURE_CAMERA) ||
             pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT) ||
             Build.VERSION.SDK_INT        if(!hasCamera)
         mTakeButton.setEnabled(false);
        mTakeButton.setOnClickListener(new View.OnClickListener() {   
            @Override
           public void onClick(View arg0) {
                // TODO Auto-generated method stub
              if(mCamera!=null)
               {
                   if (isRecording) {                      
                        mTakeButton.setText("Start");                   
                        mCamera.setPreviewCallback(null);    
                       Toast.makeText(MainActivity.this, "encode done", Toast.LENGTH_SHORT).show();                                                                   
                     isRecording = false;               
                 }else {  
                       mTakeButton.setText("Stop");
                        initial(mCamera.getParameters().getPreviewSize().width,mCamera.getParameters().getPreviewSize().height);
                        mCamera.setPreviewCallback(mPreviewCallbacx);
                       isRecording = true;  
                   } 
              }
           }
       });
        mSurfaceView=(SurfaceView)findViewById(R.id.surfaceView1);
        SurfaceHolder holder=mSurfaceView.getHolder();
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        holder.addCallback(new SurfaceHolder.Callback() {
            @Override
           public void surfaceDestroyed(SurfaceHolder arg0) {
              // TODO Auto-generated method stub
              if(mCamera!=null)
               {
                   mCamera.stopPreview();
                  mSurfaceView = null;  
                  mSurfaceHolder = null;   
               }
           }
            @Override
           public void surfaceCreated(SurfaceHolder arg0) {
                // TODO Auto-generated method stub
              try{
                    if(mCamera!=null){
                      mCamera.setPreviewDisplay(arg0);
                        mSurfaceHolder=arg0;
                    }
               }catch(IOException exception){
                  Log.e(TAG, "Error setting up preview display", exception);
              }
           }
            @Override
           public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
              // TODO Auto-generated method stub
              if(mCamera==null) return;
               Camera.Parameters parameters=mCamera.getParameters();           
                parameters.setPreviewSize(640,480);
             parameters.setPictureSize(640,480);
             mCamera.setParameters(parameters);
              try{
                    mCamera.startPreview();
                 mSurfaceHolder=arg0;
                }catch(Exception e){
                    Log.e(TAG, "could not start preview", e);
                   mCamera.release();
                  mCamera=null;
               }
           }
       });
    }
    @TargetApi(9)
    @Override
    protected void onResume(){
        super.onResume();
       if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.GINGERBREAD){
          mCamera=Camera.open(0);
     }else
       {
           mCamera=Camera.open();
      }
    }
    @Override
    protected void onPause(){
        super.onPause();
        flush();
        close();
        if(mCamera!=null){
          mCamera.release();
          mCamera=null;
       }
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
  //JNI
    public native int initial(int width,int height);
    public native int encode(byte[] yuvimage);
    public native int flush();
    public native int close();
    static{

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值