Android - 拍摄视频错误-22
Android - taking video error -22
我一直在尝试使用 com.android.hardware.Camera
软件包拍摄视频。
似乎 MediaRecorder
无法启动。
我想通过 Intent Service
拍摄视频(不在屏幕上预览输出)。
这是我的 Intent 主要功能。
private MediaRecorder mMediaRecorder;
private Camera cam = null;
public static boolean isRecording = false;
public static boolean isRunning = false;
public void onCreate() {
cam = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
try {
cam.unlock();
mMediaRecorder.setCamera(cam);
cam.lock();
} catch (Exception e){
e.fillInStackTrace();
}
isRunning = true;
// Step 2: Set sources
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
// Step 4: Set output file
String fileName = "/sdcard/" + RandomNameGenerator.setSecureFilename(".video");
mMediaRecorder.setOutputFile(fileName);
// Step 6: Prepare configured MediaRecorder
try {
mMediaRecorder.prepare();
} catch (IllegalStateException e) {
Log.d("DEBUG", "IllegalStateException preparing MediaRecorder: " + e.getMessage());
} catch (IOException e) {
Log.d("DEBUG", "IOException preparing MediaRecorder: " + e.getMessage());
}
isRecording = true;
Log.d("SERVICE VIDEO", "IS RECORDING");
try {
mMediaRecorder.start();
} catch (Exception e) {
e.printStackTrace();
}
}
public void onDestroy(){
isRecording = false;
if (mMediaRecorder != null) {
mMediaRecorder.reset(); // clear recorder configuration
mMediaRecorder.release(); // release the recorder object
mMediaRecorder = null;
isRunning = false;
}
}
这是我启动 Intent 时的日志:
E/MediaRecorder: start failed: -22
W/System.err: java.lang.RuntimeException: start failed.
W/System.err: at android.media.MediaRecorder.start(Native Method)
W/System.err: at com.example.nathan.def_calc.VideoRecorder.onCreate(VideoRecorder.java:61)
W/System.err: at android.app.ActivityThread.handleCreateService(ActivityThread.java:3192)
W/System.err: at android.app.ActivityThread.-wrap5(ActivityThread.java)
W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1568)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err: at android.os.Looper.loop(Looper.java:154)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6121)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
清单中设置了所有必要的权限。
我必须在某处声明一种缓冲区吗?我没有在 API 中找到任何关于我们如何创建视频缓冲区的文档。
有人有解决办法吗?
好的,我解决了这个问题,明显的问题是我没有任何视频缓冲区。我发现我需要一个 Surface
对应于 Camera
对象的缓冲区。添加 onCreate()
:
sft = new SurfaceTexture(0);
sf = new Surface(sft);
mMediaRecorder.setPreviewDisplay(sf);
和
sf.release();
sft.release();
在 onDestroy()
函数中成功了。
我一直在尝试使用 com.android.hardware.Camera
软件包拍摄视频。
似乎 MediaRecorder
无法启动。
我想通过 Intent Service
拍摄视频(不在屏幕上预览输出)。
这是我的 Intent 主要功能。
private MediaRecorder mMediaRecorder;
private Camera cam = null;
public static boolean isRecording = false;
public static boolean isRunning = false;
public void onCreate() {
cam = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
try {
cam.unlock();
mMediaRecorder.setCamera(cam);
cam.lock();
} catch (Exception e){
e.fillInStackTrace();
}
isRunning = true;
// Step 2: Set sources
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
// Step 4: Set output file
String fileName = "/sdcard/" + RandomNameGenerator.setSecureFilename(".video");
mMediaRecorder.setOutputFile(fileName);
// Step 6: Prepare configured MediaRecorder
try {
mMediaRecorder.prepare();
} catch (IllegalStateException e) {
Log.d("DEBUG", "IllegalStateException preparing MediaRecorder: " + e.getMessage());
} catch (IOException e) {
Log.d("DEBUG", "IOException preparing MediaRecorder: " + e.getMessage());
}
isRecording = true;
Log.d("SERVICE VIDEO", "IS RECORDING");
try {
mMediaRecorder.start();
} catch (Exception e) {
e.printStackTrace();
}
}
public void onDestroy(){
isRecording = false;
if (mMediaRecorder != null) {
mMediaRecorder.reset(); // clear recorder configuration
mMediaRecorder.release(); // release the recorder object
mMediaRecorder = null;
isRunning = false;
}
}
这是我启动 Intent 时的日志:
E/MediaRecorder: start failed: -22
W/System.err: java.lang.RuntimeException: start failed.
W/System.err: at android.media.MediaRecorder.start(Native Method)
W/System.err: at com.example.nathan.def_calc.VideoRecorder.onCreate(VideoRecorder.java:61)
W/System.err: at android.app.ActivityThread.handleCreateService(ActivityThread.java:3192)
W/System.err: at android.app.ActivityThread.-wrap5(ActivityThread.java)
W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1568)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err: at android.os.Looper.loop(Looper.java:154)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6121)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
清单中设置了所有必要的权限。 我必须在某处声明一种缓冲区吗?我没有在 API 中找到任何关于我们如何创建视频缓冲区的文档。 有人有解决办法吗?
好的,我解决了这个问题,明显的问题是我没有任何视频缓冲区。我发现我需要一个 Surface
对应于 Camera
对象的缓冲区。添加 onCreate()
:
sft = new SurfaceTexture(0);
sf = new Surface(sft);
mMediaRecorder.setPreviewDisplay(sf);
和
sf.release();
sft.release();
在 onDestroy()
函数中成功了。