我正在尝试编写一个在一个设备上录制视频并将其通过WiFi-Direct发送到另一台设备的应用。
现在,我已经无法使用MediaRecorder录制视频了。
我在以下代码示例之后构建我的应用程序
https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java
将文件设置为MediaRecorder的输出文件时,mediaRecorder.prepare()和mediarecorder.start()可以工作,但是当我调用mediaRecorder.stop()方法时,我的应用程序崩溃了。我在控制台中收到类似“ mediaRecorder stop()failed -1007 failed”之类的错误。
我检查了这个问题的建议解决方案
Android mediarecorder stop failed
但这并不能解决我的问题。
我还尝试了一些发现的示例代码,以直接使用ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(skt)
和mMediaRecorder.setOutputFile(pfd.getFileDescriptor());
来不必保护视频,并在另一台设备上与MediaPlayer一起播放,但是mediaRecorder.prepare()已经给出了一个例子
thx已经为我将获得的任何可能的帮助
*编辑
保存视频后,下一个问题出现:传输视频。 设备通过Wifidirect连接,并且有一个共享套接字。 我想向视频发送此消息:
public void sendFile(String filepath) {
int len;
byte buf[] = new byte[1024];
try {
OutputStream out = socket.getOutputStream();
File file = new File(filepath);
FileInputStream is = new FileInputStream(file);
while ((len = is.read(buf)) != -1) {
out.write(buf, 0, len);
}
out.close();
is.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
在发送端没有任何异常,但是我如何查看是否真的发送了整个文件的数据? 在接收方,我尝试了以下操作:`公共类SendReceive扩展了线程{
private InputStream inputStream;
private OutputStream outputStream;
public SendReceive(Socket skt) {
socket = skt;
try {
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
byte[] bytes = new byte[16 * 1024];
String path = null;
try {
while (inputStream.read(bytes) != -1) {
String filename = (getFilesDir() + "/")
+ System.currentTimeMillis() + ".mp4";
int count;
byte[] buffer = new byte[8192]; // or 4096, or more
OutputStream out = null;
BufferedOutputStream bos= null;
try {
File video = new File(filename);
File dirs = new File(video.getParent());
if (!dirs.exists())
dirs.mkdirs();
video.createNewFile();
path = video.getAbsolutePath();
out = new FileOutputStream(video);
bos = new BufferedOutputStream(out);
} catch (FileNotFoundException ex) {
System.out.println("File not found. ");
}
copyFile(inputStream,bos);
out.flush();
out.close();
// showVideo(filename);
byte[] namearray = path.getBytes();
handler.obtainMessage(MESSAGE_READ, counter, -1, namearray).sendToTarget();
}
} catch (IOException e) {
e.printStackTrace();
}
}
。 。
public static boolean copyFile(InputStream inputStream, OutputStream out) {
byte buf[] = new byte[1024];
int len;
try {
while ((len = inputStream.read(buf)) != -1) {
out.write(buf, 0, len);
}
out.flush();
inputStream.close();
} catch (IOException e) {
return false;
}
return true;
}
当这样做时,在路径的位置没有创建文件,但是我确实从输入流中接收字节。我只想保护从另一台设备上的另一台设备发送并在MediaPlayer播放后播放的视频
问候
答案 0 :(得分:0)
我想我通过录制视频找到了解决我的问题的方法。此项帮助我: capturing a video using camera2 and MediaRecorder
似乎在大多数样本中我发现缺少一件简单的事情:
private CaptureRequest.Builder mPreviewBuilder;
...添加我要捕获的紧急情况,设置mediaRecorder,准备MediaRecorder等...
CaptureRequest request;
request= mPreviewBuilder.build();
cameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession ccs) {
cameraCaptureSession = ccs;
updatePreview();
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
// UI
start.setText("stop");
isrecording = true;
try {
cameraCaptureSession.setRepeatingRequest(request,
new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureStarted(CameraCaptureSession session, CaptureRequest request, long timestamp, long frameNumber) {
super.onCaptureStarted(session, request, timestamp, frameNumber);
}
@Override
public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
super.onCaptureCompleted(session, request, result);
}
}, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
});
mMediaRecorder.start();
}
也许这可以帮助任何遇到类似问题的人