2013-01-08 60 views
2

我在android中使用VideoWriter opencv類與JNI的問題。OpenCV android VideoWriter問題

我的目標是簡單地捕獲相機幀並使用VideoWriter將它們寫入文件。

下面是代碼:

本機部分 - 3功能給init作家,寫一個幀並釋放作家。

JNIEXPORT void JNICALL Java_com_driveassist_drivingassistant_WorkActivity_InitWriter(JNIEnv *env, jobject, jstring path) 
{ 
    char const * new_path; 
    new_path = env->GetStringUTFChars(path , NULL) ; 

    writer = VideoWriter(); 

    stringstream ss; 
    ss << new_path; 
    ss << "//1.mp4"; 

    string p; 
    ss >> p; 

    writer.open(p, CV_FOURCC('P', 'I', 'M', '1'), 24, Size(1024, 768)); 
} 

JNIEXPORT void JNICALL Java_com_driveassist_drivingassistant_WorkActivity_WriteFrame(JNIEnv *, jobject, jlong frame) 
{ 
    Mat* im=(Mat*)frame; 
    Mat im_p = (*im).clone(); 

    if(writer.isOpened()) 
    { 
     resize(im_p, im_p, Size(1024, 768), 0, 0, INTER_AREA); 

     writer.write(im_p); 
    } 

} 

JNIEXPORT void JNICALL Java_com_driveassist_drivingassistant_WorkActivity_ReleaseWriter(JNIEnv *, jobject) 
{ 
    if(writer.isOpened()) 
    { 
     writer.release(); 
    } 
} 

Java的一部分:

我使用的活動與OpenCV的CameraBridgeViewBase:

public class WorkActivity extends Activity implements CvCameraViewListener { 

    private CameraBridgeViewBase mOpenCvCameraView; 

    private Mat mRgba; 

    private File mediaStorageDir; 

    private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) { 
     @Override 
     public void onManagerConnected(int status) { 
      switch (status) { 
       case LoaderCallbackInterface.SUCCESS: 
       { 
        System.loadLibrary("driving_assistant"); 

        mOpenCvCameraView.enableView(); 

        InitWriter(mediaStorageDir.getPath()); 
       } break; 
       default: 
       { 
        super.onManagerConnected(status); 
       } break; 
      } 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

     setContentView(R.layout.activity_work); 

     mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "DriveAssistantCam"); 

     if (! mediaStorageDir.exists()){ 
      if (! mediaStorageDir.mkdirs()){ 
       Log.d("DrivingAssistant", "failed to create directory"); 
      } 
     } 

     mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.work_camera_surface_view); 

     mOpenCvCameraView.setCvCameraViewListener(this); 
    } 

    @Override 
    public void onPause() 
    { 
     if (mOpenCvCameraView != null) 
      mOpenCvCameraView.disableView(); 

     super.onPause(); 

     // ReleaseWriter(); 
    } 

    @Override 
    public void onResume() 
    { 
     super.onResume(); 

     OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback); 

     // OpenCVLoader.initDebug(); 
    } 

    public void onDestroy() { 
     super.onDestroy(); 

     if (mOpenCvCameraView != null) 
      mOpenCvCameraView.disableView(); 

     ReleaseWriter(); 
    } 

    public void onCameraViewStarted(int width, int height) { 
     mRgba = new Mat(height, width, CvType.CV_8UC4); 
    } 

    public void onCameraViewStopped() { 
     mRgba.release(); 

     ReleaseWriter(); 
    } 

    public Mat onCameraFrame(Mat inputFrame) { 
     inputFrame.copyTo(mRgba); 

     WriteFrame(mRgba.getNativeObjAddr()); 

     return mRgba; 
    } 

的代碼沒有例外運行,但視頻文件不會出現。本地庫加載正常,並且應用程序可以訪問目錄(我試圖用java.io.File創建一個文件)。

我的系統是Ubuntu 12.10,Eclipse Indigo。我在模擬器和星系標籤2上試過這段代碼。

非常感謝!

回答

4

嗯,這是成爲一個好傳統回答自己qestions :)

OpenCV進行Adnroid內沒有按的還支持視頻的閱讀和寫作。我發現這在谷歌組 「Opencv4Android」:

安德烈Pavlenko [email protected]черезgooglegroups.com 4 янв。 (5天前)

android-opencv不幸的是,在OpenCV上不支持 ,即使在更高版本的2.4.3.2中也沒有視頻讀寫功能。希望 它將在下一個版本中啓用...

也許我必須使用ffmpeg或其他庫。