Android Album Vorhören Verarbeitung während der video-Aufnahme
Ich bin mit Android-Entwicklung (SDK 2.2) und ich würde gerne eine video-Aufnahme mit mediaRecorder
und, zur gleichen Zeit, einige der Prozess auf jedem Album Vorhören Rahmen.
Ich video aufnehmen mit MediaRecorder
in einem Projekt, in einem anderen verwende ich die onPreviewFrame(byte[] data
, Camera camera
) (aus PreviewCallback
) für die Verarbeitung von Vorschau-Bildern.
Ich habe versucht, erstellen Sie eine Kamera und verwenden Sie es mit mediaRecorder
(setCamera
- Funktion) aber es funktioniert nicht.
Ist es möglich zu tun, sowohl in der gleichen Zeit?
Eigentlich verstehe ich nicht, wie die Verknüpfung zweier Dinge?
Mein code :
package ch.fraise;
import java.io.IOException;
import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class CameraActivity extends Activity implements SurfaceHolder.Callback,
Camera.AutoFocusCallback {
private SurfaceView preview;
private SurfaceHolder previewHolder;
private MediaRecorder mRecorder;
private Camera mCamera;
private boolean mPreviewRunning = false;
private boolean mCaptureFrame = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("", "Begin onCreate");
setContentView(R.layout.main);
preview = (SurfaceView) findViewById(R.id.surfaceView1);
previewHolder = preview.getHolder();
previewHolder.addCallback(this);
previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mRecorder = new MediaRecorder();
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onPause() {
super.onPause();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.capture_menu, menu);
return true;
}
public void startRecording() {
Log.e("", "Begin StartRecording");
mCaptureFrame = true;
mRecorder.start();
}
public void stopRecording() {
Log.e("", "Begin StopChange");
mRecorder.stop();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//Handle item selection
switch (item.getItemId()) {
case R.id.startRecording:
startRecording();
return true;
case R.id.stopRecording:
stopRecording();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.e("", "Begin surfaceDestroy");
mCamera = Camera.open();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mPreviewRunning = false;
mCamera.release();
mRecorder.reset();
mRecorder.release();
}
@Override
public void onAutoFocus(boolean success, Camera camera) {
//TODO Auto-generated method stub
}
/*
* PreviewCallback()
*
* this callback captures the preview at every frame and puts it in a byte
* buffer. we will evaluate if this is a frame that we want to process, and
* if so, we will send it to an asynchronous thread that will process it to
* an ARGB Bitmap and POST it to the server
*/
PreviewCallback previewCallback = new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera camera) {
Log.e("", "onPreviewFrame pass");
if (mCaptureFrame) {
mCaptureFrame = false;
//new FrameHandler().execute(data);
}
}
};
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Log.e("", "Begin SurfaceChange");
mRecorder.reset();
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mRecorder.setOutputFile("/sdcard/videotest2.mp4");
mRecorder.setVideoFrameRate(30);
mRecorder.setPreviewDisplay(previewHolder.getSurface());
try {
mRecorder.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (mPreviewRunning)
mCamera.stopPreview();
Camera.Parameters p = mCamera.getParameters();
//p.setPreviewSize(width, height);
mCamera.setParameters(p);
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}
mCamera.setPreviewCallback(previewCallback);
mCamera.startPreview();
mPreviewRunning = true;
}
}
sowie die Berechtigungen in der XML-Datei :
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.RECORD_VIDEO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- Was ist Ihre Frage?
- ich habe meinen code aber ich habe den folgenden Fehler W/System.err( 5476): java.io.IOException: Vorbereitung fehlgeschlagen. die Anwendung ausführen, nach diesem ersten Fehler, bis ich starten video-Aufzeichnung. Dann habe ich eine java.lang.IllegalStateException E/AndroidRuntime( 5476): at android.media.MediaRecorder.start(Native-Methode)
- Hallo, Sind Sie in der Lage, dies zu erreichen? Ich bin auch stuck an dieser Stelle.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eureka! Der trick ist, fügen Sie Ihrer
PreviewCallback
imsurfaceChanged(...)
SurfaceHolder.Callback
! Nachdem Sie dies getan haben, werden Sie weiter, um eine Vorschau-frame-Daten nach einem MediaRecorder läuft!Beispiel:
mMediaRecorder.setCamera(mCamera)
Methode, dann muss ich anrufenmCamera.unlock()
was vor nicht lassen, immer eine Vorschau auf die Bilder. Wenn ich nicht anrufenmMediaRecorder.setCamera(mCamera)
MethodemMediaRecorder.start()
stürzt mitIllegalStateException
da die Kamera bereits im Einsatz. Kannst du mehr (oder vollständigen) code wie haben Sie machte Ihr eureka-trick?kein Zugriff auf den video-stream während der Aufnahme, onPreviewFrame wird nicht aufgerufen, sobald Sie die Aufnahme starten. Seltsam, onPreviewFrame nicht scheinen, um genannt nach der Aufnahme entweder...
Fügen Sie einfach Tags um Ihre manifest-Datei .So wird es funktionieren.Beispiel-code gezeigt unten.
zB:-
wenn Sie mit os 2.2 oder höher, dann verwenden Sie diese Methode, Ihre Vorbereitung ausgefallen und andere Ausnahme wird entfernt