2013-01-08 61 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或其他库。