gpt4 book ai didi

java - OpenCV android VideoWriter 问题

转载 作者:搜寻专家 更新时间:2023-11-01 08:06:05 25 4
gpt4 key购买 nike

我在 android 中将 VideoWriter opencv 类与 JNI 结合使用时遇到问题。

我的目标是简单地捕获相机帧并使用 VideoWriter 将它们写入文件。

代码如下:

Native 部分 - 初始化 writer、编写框架和释放 writer 的 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 部分:

我使用 opencv CameraBridgeViewBase 的 Activity :

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;
}

代码运行无异常,但没有出现视频文件。 native 库正常加载,并且应用程序可以访问该目录(我已经尝试使用 java.io.File 在那里创建一个文件)。

我的系统是 Ubuntu 12.10,Eclipse Indigo。我在模拟器和 galaxy tab 2 上试过这段代码。

非常感谢!

最佳答案

好吧,回答我自己的问题已经成为一个好传统:)

OpenCV for adnroid 尚不支持视频读写。我在谷歌组“Opencv4Android”中找到了这个:

Andrey Pavlenko andrey.pavlenko@itseez.com через googlegroups.com 4 янв. (5 дн. назад)

кому: android-opencv Unfortunately on Android OpenCV doesn't support yet video reading and writing even in the later version 2.4.3.2. Hope it will be enabled in the next release...

可能我必须使用 ffmpeg 或其他一些库。

关于java - OpenCV android VideoWriter 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14223723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com