2010-11-20 38 views
6

Tôi có hai chương trình đơn giản, máy chủ và máy khách, cả hai đều ở máy chủ cục bộ. Những gì tôi muốn làm là để streaming video từ máy chủ cho khách hàng thông qua ổ cắm và khách hàng có thể chơi nó bằng cách sử dụng filediscriptor của ổ cắm. Trước tiên, tôi cố gắng gửi một số tin nhắn và khách hàng có thể nhận được nó. Sau đó tôi gửi một vài byte video từ thẻ của máy chủ đến máy khách. Các khách hàng có thể nhận được những byte nhưng không thể chơi nó. Bất cứ ai cũng biết làm thế nào để giải quyết vấn đề?Truyền video qua ổ cắm và phát từ máy khách

Đây là máy chủ và mã khách hàng của tôi đoạn:

Server:

 //Receive request from client. 
    Socket client=serversocket.accept(); 
    System.out.println("accept"); 

    //Receive client message. 
    BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); 
    String str=in.readLine(); 
    System.out.println("read:"+str); 

    //Send message to client. 
    //PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())),true); 
    //out.println("server message"); 
    FileInputStream fis=new FileInputStream("/sdcard/toystory3.3gp"); 
    byte buffer[]=new byte[2000]; 
    fis.read(buffer,0,20); 
    DataOutputStream out=new DataOutputStream(client.getOutputStream()); 
    out.write(buffer,0,20); 
    in.close(); 
    out.close(); 
    client.close(); 
    System.out.println("close"); 

Chủ đầu tư:

Socket socket=new Socket("127.0.0.1",4444); 
String message="Initial"+"\r\n"; 
//Send message to server. 
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); 
out.println(message); 

//Receive message from server. 
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream())); 
String msg=br.readLine(); 
//ParcelFileDescriptor pfd=ParcelFileDescriptor.fromSocket(socket); 
//MediaPlayer m=new MediaPlayer(); 
//m.setDataSource(pfd.getFileDescriptor()); 
//m.prepare(); 
//m.start(); 

if(msg!=null) 
{ 
    System.out.println("Data received."); 
    System.out.println(msg); 
} 
else 
{ 
    System.out.println("Data not received."); 
} 
out.close(); 
br.close(); 
socket.close(); 
+0

Có giao diện của tôi- http://stackoverflow.com/questions/6116880/stream-live-video-from-phone-to-phone-using-socket-fd/10260068#10260068 –

Trả lời

5

này sẽ không làm việc vì 3gp (và avi khác file có nguồn gốc như mp4 , vv) có tiêu đề (sic) ở cuối tệp. Vì vậy, bất kỳ người chơi nào cũng phải có quyền truy cập vào toàn bộ tệp.

RTSP/RTP là cách duy nhất để phát trực tuyến video vào lúc này. Luồng thích ứng HTTP đang hoạt động.

Ngoài ra nếu bạn đang cố gắng thực hiện video p2p (thiết bị đến thiết bị), bạn nên biết rằng tất cả các thiết bị trên mạng của nhà điều hành đều đứng sau tường lửa NAT. Họ chỉ có thể mở các kết nối ra bên ngoài. Bạn sẽ cần phải sử dụng một số loại xuyên NAT.

+0

Peter, cảm ơn câu trả lời của bạn . Lý do tôi đang sử dụng http streaming là bởi vì tôi muốn xây dựng một httpserver đơn giản trong điện thoại của tôi để lừa các mediaplayer rằng nó nhận được các gói http từ bên ngoài. Httpserver này cần phải đệm các gói video từ bên ngoài. Điều đó có thể không? Thực ra tôi đã sử dụng vlc để truyền các gói video rstp đến điện thoại của mình. Nhưng tôi thấy rằng các gói dữ liệu rtsp không thể được đệm/lưu. Bạn có bất cứ đề nghị/lời khuyên về điều này? – charlie

+0

Hiện tại, Android chưa hỗ trợ (thích ứng) http streaming. Nó sử dụng HTTP nhưng chỉ tải xuống tệp. Nhưng nếu bạn sử dụng VLC mà có thể làm việc - Tôi không có kinh nghiệm với VLC vì vậy tôi không thể cung cấp cho bạn lời khuyên nào ở đây. –

0

Tôi đã cố gắng chuyển ffmpeg sang android để giải quyết vấn đề về định dạng video và phát trực tiếp cho Android. Nhưng tôi phát hiện ra rằng xây dựng ffmpeg cho android với tất cả các công cụ mạng là khá khó khăn.

RTSP có nhiều cấu hình cho phát trực tuyến, tôi đã quản lý để có được thứ gì đó như bạn muốn với MediaPlayer và nội dung, bạn nên tìm hiểu các định dạng mà bạn đang phát trực tuyến (vlc trong trường hợp đó) tốt hơn một chút .

Ngoài ra, mất rất nhiều lúc máy chủ darwin streaming dễ cấu hình của nó, tôi đã có thể phát trực tuyến tới thiết bị Android sử dụng thiết bị đó.

+0

Cảm ơn rất nhiều. Tôi đã quản lý để streaming các gói rtsp bởi vlc, nhưng vấn đề là phía Android dường như không hỗ trợ nhiều chức năng của rtsp, ví dụ, đệm dữ liệu trực tuyến. Đó là lý do tại sao tôi đang cố gắng xây dựng một máy chủ địa phương http để cung cấp dữ liệu như những gì tôi có thể kiểm soát. Trên thực tế, vlc cũng hỗ trợ http streaming, nhưng nó khá không ổn định. Tôi không thử darwin. – charlie

Các vấn đề liên quan