2

AndroidのJNIでVideoWriteropencvクラスを使用する際に問題が発生しました。

私の目的は、単にカメラフレームをキャプチャし、VideoWriterを使用してファイルに書き込むことです。

コードは次のとおりです。

ネイティブパート-ライターを初期化し、フレームを書き込み、ライターを解放する3つの関数。

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部分:

opencvCameraBridgeViewBaseでアクティビティを使用します。

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を使用してそこにファイルを作成しようとしました)。

私のシステムはUbuntu12.10、EclipseIndigoです。私はエミュレーターとギャラクシータブ2でこのコードを試しました。

どうもありがとう!

4

1 に答える 1

4

さて、私自身の質問に答えることは良い伝統になりつつあります:)

adnroid用のOpenCVは、まだビデオの読み取りと書き込みをサポートしていません。私はこれをグーグルグループ「Opencv4Android」で見つけました:

アンドレイ・パヴレンコandrey.pavlenko@itseez.comчерезgooglegroups.com4янв。(5日目)

кому:android-opencv残念ながら、AndroidではOpenCVは、後のバージョン2.4.3.2でもまだビデオの読み取りと書き込みをサポートしていません。次のリリースで有効になることを願っています...

おそらく、ffmpegまたは他のライブラリを使用する必要があります。

于 2013-01-09T13:41:18.087 に答える