Tôi đang cố tải luồng video từ điểm A (2.1 điện thoại Android) đến điểm B (máy chủ của tôi) trong thời gian thực. Tôi sẽ làm như thế nào? chi tiết dưới đây là những nỗ lực của tôi (một ít lâu, nhưng súc tích!)phát tệp MediaRecorder trong khi đang ghi
Mục đích là để có được một đoạn video dài giờ ghi với điện thoại đến máy chủ mà không cần tạm dừng/dừng dòng. một sự chậm trễ lên đến vài phút không phải là một vấn đề. Tôi đã thử ba cách tiếp cận
- chủ đề một FileInputStream mà đọc từ đặc tả tập tin của video điểm đến
- gọi MediaRecoder.setOutputFile trên các FD của một 'người gửi' socket. Ổ cắm này kết nối với LocalSocketServer, có đích là ổ cắm 'máy thu'.
- mở một socket để máy chủ của tôi và cho setOutputFile nó FD
không may cả hai nỗ lực đã thất bại.
- Chỉ đăng ký 24 byte bất cứ khi nào tôi gọi FileInputStream.available(), và con số thực tế của byte chỉ sau khi tôi gọi Recorder.stop()
mang lại cho tôi đẹp vô dụng stacktrace này
ERROR/AndroidRuntime (18532): Gây ra bởi: java.lang.RuntimeException: bắt đầu thất bại. LỖI/AndroidRuntime (18.532): tại android.media.MediaRecorder.start (Native Method) LỖI/AndroidRuntime (18.532): tại com.example.demovideo.DemoVideo.initializeCamera (...) ...
cùng lỗi 2
đoạn mã (phần bỏ đi)
1)
fileOut = new FileOutputStream(pathToFile);
...
recorder.setOutputFile(fileOut.getFD());
recorder.prepare()
recorder.start()
// in an Async Thread
fileIn = FileInputStream(fileOut.getFD);
while (recording) {
fos.flush();
Log.w("---", "bytesAvailable: " + fileIn.available()); //always returns 24
Thread.sleep(1000);
}
2)
// in a Thread
server = new LocalServerSocket(SOCKET_ADDRESS);
while (true){
receiver = server.accept();
if (receiver != null){
InputStream input = receiver.getInputStream();
... // processing would go here
} }
sender = new LocalSocket();
sender.connect(new LocalSocketAddress(SOCKET_ADDRESS));
recorder.setOutputFile(sender.getFileDescriptor());
...
recorder.prepare();
recorder.start(); // <- error
- đúng cách tiết kiệm một video uncorrupted để sd
- công trình nếu tôi sử dụng setOutputFile (pathToFile) để thay thế. ổ cắm cũng làm việc khi tôi chạy
sender.getOutputStream().write(message.getBytes());
Tôi đang cố gắng triển khai cùng chức năng. Nhưng tôi không nhận được phương pháp của bạn. Bạn thiết lập recorder.setOutputFile hai lần: một lần vào một tập tin, cái kia vào một ổ cắm. Tôi nghĩ rằng máy ghi âm sẽ làm việc với fileID mới bất cứ khi nào bạn thay đổi, thay vì với nhiều fileID. – user1914692
1) và 2) là hai ví dụ riêng biệt – ebaum
Nếu chúng tách biệt, thì làm cách nào để bạn triển khai hai tác vụ cùng một lúc? Trên thực tế, nếu bạn làm hai nhiệm vụ riêng biệt, nó sẽ là một vấn đề khó khăn. Đối với tác vụ truyền trực tuyến, hãy xem Spydroid-ipcamera trong code.google – user1914692