Phát trực tiếp video từ điện thoại Android này sang điện thoại Android khác qua WiFi


115

Tôi đã tìm kiếm trên internet nhiều ngày nay về cách triển khai tính năng phát video từ điện thoại Android sang điện thoại Android khác qua kết nối WiFi nhưng dường như tôi không tìm thấy bất kỳ điều gì hữu ích. Tôi đã tìm kiếm các nhà phát triển Android cho mã mẫu, stackoverflow, google, blog android nhưng không có gì. Tất cả những gì tôi có thể tìm thấy là một số loại giải pháp từ điện thoại đến máy tính để bàn hoặc máy tính để bàn để phát trực tuyến, nhưng không có gì mà tôi có thể mượn để triển khai.

Tôi cần điều khiển rô bốt bằng arduino ADK, vì vậy tôi đang sử dụng 2 điện thoại, một điện thoại sẽ được gắn trên rô bốt và một điện thoại khác sẽ nhận luồng video từ rô bốt. Tôi đề cập đến điều này vì tôi đang cố gắng đạt được độ trễ nhỏ nhất giữa thời gian phát sóng và thời gian xem.

Tôi đang viết 2 ứng dụng, một ứng dụng chính để điều khiển rô bốt (từ điện thoại cầm tay), ứng dụng này sẽ điều khiển ứng dụng phụ và nhận luồng và ứng dụng phụ thứ hai sẽ chạy trên điện thoại có gắn rô-bốt, điều khiển động cơ / bộ truyền động / phát trực tuyến đến ứng dụng chính. Rất tiếc, tôi không thể sử dụng các ứng dụng của bên thứ ba. Tôi cần tích hợp mã luồng video vào 2 ứng dụng của mình.

Có những lựa chọn nào để đạt được điều này? Nó cũng rất khó làm vì tôi chưa bao giờ làm việc với videostreaming, khó khăn là tôi đang làm khá tốt trong cả phát triển Java và Android. Tôi nên mã hóa / giải mã luồng như thế nào, làm cách nào để bắt đầu kết nối, tôi có cần làm việc với UDP thay vì TCP / IP không? Tôi thực sự không biết bắt đầu từ đâu, không có mã mẫu ở đâu cả. Tôi khá chắc chắn rằng điều này có thể đạt được. Tôi chỉ không thể tìm thấy bất cứ điều gì hữu ích để giúp tôi bắt đầu đúng hướng.

Tôi tình cờ gặp spydroid nhưng nó đang sử dụng VLC trên máy tính để bàn nên nó không tốt cho tôi.


CHỈNH SỬA: Kiểm tra blog của Cagney Moreau . Anh ấy đi vào chi tiết về việc thực hiện điều này.


1
Bạn có thể chia sẻ dự án của bạn, tôi đang làm điều tương tự, nhưng streaming video giữa Android và máy tính để bàn (WebClient) ... Tôi nghĩ về html5 + WebSockets nhưng tôi phải đối mặt với nhiều vấn đề ...
Buksy

1
Tôi đang phát triển giải pháp như vậy, giống 80% so với những gì bạn đang cố gắng làm. Bạn cần phải định cấu hình máy chủ VOIP và sau đó tạo ứng dụng khách cho VOIP đó sẽ chuyển giọng nói và video của bạn. Tôi cũng đang tìm kiếm nó. Nếu ai đó biết, xin hãy cho tôi biết.
AZ_

1
email được cung cấp trên hồ sơ của tôi
AZ_

1
Kiểm tra dự án của tôi. Mọi thứ trong java và giải thích chi tiết cagneymoreau.com/stream-video-android
Cagney

1
cảm ơn Tôi cũng đang làm việc trên một robot. Nội dung thú vị
cagney 4/1018

Câu trả lời:


55

Nếu bạn không cần chức năng ghi và phát lại trong ứng dụng của mình thì việc sử dụng ứng dụng và trình phát trực tuyến có sẵn là một lựa chọn hợp lý.

Tuy nhiên, nếu bạn cần chúng trong ứng dụng của mình, bạn sẽ phải xem xét API MediaRecorder (đối với ứng dụng máy chủ / máy ảnh) và MediaPlayer (đối với ứng dụng khách / trình phát).

Mã mẫu nhanh cho máy chủ:

// this is your network socket
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
mCamera = getCameraInstance();
mMediaRecorder = new MediaRecorder();
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// this is the unofficially supported MPEG2TS format, suitable for streaming (Android 3.0+)
mMediaRecorder.setOutputFormat(8);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
mediaRecorder.setOutputFile(pfd.getFileDescriptor());
mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
mMediaRecorder.prepare();
mMediaRecorder.start();

Về phía người chơi, nó hơi phức tạp, bạn có thể thử cách này:

// this is your network socket, connected to the server
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(pfd.getFileDescriptor());
mMediaPlayer.prepare();
mMediaPlayer.start();

Thật không may, mediaplayer có xu hướng không thích điều này, vì vậy bạn có một số tùy chọn: (a) lưu dữ liệu từ socket sang tệp và (sau khi bạn có một chút dữ liệu) chơi với mediaplayer từ tệp hoặc (b) tạo một http nhỏ proxy chạy cục bộ và có thể chấp nhận yêu cầu GET của người trung gian, trả lời bằng tiêu đề HTTP, sau đó sao chép dữ liệu từ máy chủ từ xa vào nó. Đối với (a), bạn sẽ tạo trung gian bằng đường dẫn tệp hoặc url tệp, đối với (b) cung cấp cho nó một url http trỏ đến proxy của bạn.

Xem thêm:

Truyền video trực tiếp từ điện thoại sang điện thoại bằng socket fd

MediaPlayer nói lắp khi bắt đầu phát lại mp3


2
Xin chào Alex, bạn có thử nghiệm nào với việc gửi tệp âm thanh được lưu trữ cục bộ từ điện thoại Android qua RTP không?
B770,

xin chào bạn có thể vui lòng gửi cho tôi dự án hoàn chỉnh của nó được không?
Umar Asghar

1
bạn có thể vui lòng đăng dự án hoàn chỉnh của bạn?
Yazhini Murugaiya

cái nào là ổ cắm máy chủ và ổ cắm máy khách
Yazhini Murugaiya

1
@AhmedHamdy Thật vậy: ở cấp độ API 23 (Android 6.0), bạn có thể sử dụng setDataSource(MediaDataSource)thay thế FileDescriptor. Việc triển khai MediaDataSourcesẽ cho phép bạn thực hiện việc đọc và đệm mạng của riêng mình mà không cần ghi vào tệp tạm thời.
Alex I

9

Tôi đã từng làm việc như thế này một lần, nhưng gửi video và phát video đó trong thời gian thực là một việc thực sự phức tạp. Tôi khuyên bạn chỉ nên làm việc với PNG. Trong quá trình triển khai của tôi Điều tôi đã làm là chụp các tệp PNG bằng máy ảnh chủ và sau đó gửi chúng qua mạng tới máy khách, Máy sẽ hiển thị hình ảnh ngay khi nhận được và yêu cầu hình ảnh tiếp theo từ máy chủ. Vì bạn đang sử dụng Wi-Fi nên giao tiếp sẽ đủ nhanh để nhận được khoảng 8-10 hình ảnh mỗi giây (chỉ gần đúng, tôi đã làm việc trên Bluetooth). Vì vậy, đây sẽ giống như một video liên tục nhưng ít nỗ lực hơn nhiều. Đối với giao tiếp, bạn có thể sử dụng ổ cắm UDP (Nhanh hơn và ít phức tạp hơn) hoặc DLNA (Không chắc chắn cách hoạt động).


Vâng, đây sẽ là phương sách cuối cùng của tôi. Cảm ơn vì bạn đã phản hồi!
androidu

3
Chắc chắn một luồng jpeg sẽ hiệu quả hơn một luồng png?
stealthcopter

Tôi chỉ đề xuất sử dụng một hình ảnh, bạn có thể sử dụng bất kỳ định dạng nào bạn muốn
Arveen

@krossreg> bạn có thể vui lòng dán mã mẫu cho những gì bạn đề xuất không?
Jasper

8

Bạn có thể sử dụng IP Webcam hoặc có thể sử dụng DLNA. Ví dụ, các thiết bị của Samsung đi kèm với một ứng dụng có tên là AllShare có thể chia sẻ và truy cập các thiết bị hỗ trợ DLNA trên mạng. Tuy nhiên, tôi nghĩ IP Webcam là lựa chọn tốt nhất của bạn. Bạn sẽ có thể mở luồng nó tạo bằng trình phát Video MX hoặc thứ gì đó tương tự.


2
Tôi đang viết 2 ứng dụng, một ứng dụng chính để điều khiển rô-bốt (từ điện thoại cầm tay) và xem rô-bốt nhìn thấy gì và ứng dụng phụ thứ hai sẽ chạy trên điện thoại có gắn rô-bốt, điều khiển động cơ / bộ truyền động / phát trực tuyến. Rất tiếc, tôi không thể sử dụng các ứng dụng của bên thứ ba. Tôi cần tích hợp mã luồng video vào 2 ứng dụng của mình.
androidu

Có lẽ bạn có thể thực hiện một số nghiên cứu về thông số kỹ thuật DLNA và cố gắng tạo một ứng dụng sử dụng nó cho riêng bạn hoặc có thể gửi email cho nhà phát triển của IP Webcam và yêu cầu một số trợ giúp.
ldam

1
Đảo ngược kỹ sư nó? : P
mgibson

Tôi đoán là tôi không có lựa chọn nào khác.
androidu

5

Bạn có thể kiểm tra VLC android mà nó có thể phát trực tuyến và phát video, nếu bạn muốn ghi nhớ nhiều hơn, bạn có thể kiểm tra GIT của họ để phân tích những gì họ làm. Chúc may mắn!


3
Tôi đang xem xét Android VLC. Bạn có thể cho tôi biết cách sử dụng nó để phát video không?
user1914692
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.