2011-11-29 47 views
6

Tôi có một dự án Android, nơi tôi cần xây dựng ứng dụng khách để nhận luồng video UDP hoặc RTP unicast và phát lại chúng. Thật không may, tôi dường như không thể làm việc này và đã tìm kiếm rộng rãi cho một giải pháp!Phát video UDP trên Android

Tôi đang thử nghiệm trên Xoom (Android 3.2) và Nexus S (Android 2.3.6) và biết rằng họ có thể phát nội dung khi sử dụng MX Player (ứng dụng trình phát đa phương tiện của bên thứ ba) làm ứng dụng khách nhưng tôi không thể tải trình phát phương tiện gốc để phát lại nội dung. Tôi đã thử sử dụng cả một VideoView đơn giản và một MediaPlayer nhưng cả hai đều thất bại với cùng một mã lỗi và tôi thực sự không thể tìm thấy bất kỳ thông tin hữu ích nào.

Video được mã hoá H.264 với âm thanh aac.

Ngoài ra, máy chủ là giải pháp của bên thứ ba mà tôi không có quyền truy cập (ngoài việc chỉ định udp hoặc rtp) nhưng như tôi đã nói, khi sử dụng MX Player, các luồng có thể được phát.

Đây là máy nghe nhạc phương tiện truyền thông phần của mã của tôi:

public class Main extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    try { 
     MediaPlayer player = new MediaPlayer(); 
     SurfaceView surface = (SurfaceView) findViewById(R.id.video); 

     player.setDisplay(surface.getHolder()); 

     player.setDataSource(this, Uri.parse("udp://192.168.0.78:1234")); 

     player.prepare(); 

     player.setOnPreparedListener(new OnPreparedListener() { 

      @Override 
      public void onPrepared(MediaPlayer mp) { 
       Log.d("SimpleVideoPlayer", "Starting player"); 
       mp.start(); 
      } 
     }); 

     player.setOnErrorListener(new OnErrorListener() { 

      @Override 
      public boolean onError(MediaPlayer mp, int what, int extra) { 
       Log.d("SimpleVideoPlayer", "error with code: " + what); 
       return false; 
      } 
     }); 

    }catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

Các lỗi Tôi nhận được là:

11-29 15:44:14.660: D/MediaPlayer(15451): Couldn't open file on client side, trying server side 
11-29 15:44:14.670: E/MediaPlayer(15451): error (1, -2147483648) 
11-29 15:44:14.670: W/System.err(15451): java.io.IOException: Prepare failed.: status=0x1 
11-29 15:44:14.670: W/System.err(15451): at android.media.MediaPlayer.prepare(Native Method) 
11-29 15:44:14.670: W/System.err(15451): at com.android.vidplayer.Main.onCreate(Main.java:26) 
11-29 15:44:14.670: W/System.err(15451): at android.app.Activity.performCreate(Activity.java:4397) 
11-29 15:44:14.670: W/System.err(15451): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
11-29 15:44:14.670: W/System.err(15451): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1804) 
11-29 15:44:14.670: W/System.err(15451): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1856) 
11-29 15:44:14.670: W/System.err(15451): at android.app.ActivityThread.access$500(ActivityThread.java:125) 
11-29 15:44:14.670: W/System.err(15451): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1049) 
11-29 15:44:14.670: W/System.err(15451): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-29 15:44:14.670: W/System.err(15451): at android.os.Looper.loop(Looper.java:132) 
11-29 15:44:14.670: W/System.err(15451): at android.app.ActivityThread.main(ActivityThread.java:4157) 
11-29 15:44:14.670: W/System.err(15451): at java.lang.reflect.Method.invokeNative(Native Method) 
11-29 15:44:14.670: W/System.err(15451): at java.lang.reflect.Method.invoke(Method.java:491) 
11-29 15:44:14.670: W/System.err(15451): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
11-29 15:44:14.670: W/System.err(15451): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
11-29 15:44:14.670: W/System.err(15451): at dalvik.system.NativeStart.main(Native Method) 

tôi đã thiết lập cho phép Internet cũng có.

Có ai có bất kỳ đề xuất nào không ?? Tôi không thể tìm thấy bất kỳ thông tin hữu ích ở bất cứ đâu.

Cảm ơn.

+0

Bạn đã thử sử dụng 'player.prepareAysnc()' thay vì 'player.prepare()'? Bạn nên sử dụng 'preparAsync()' khi phát luồng. – Squonk

Trả lời

3

Tôi không chắc chắn Android natively hỗ trợ UDP vì nó không được liệt kê trong các Nghị định thư Mạng

http://developer.android.com/guide/appendix/media-formats.html

Nhiều mediaplayers bên thứ 3 được dựa trên các thư viện FFMPEG. Bạn có thể muốn sử dụng FFMPEG trong dự án của bạn mặc dù đó là một nhiệm vụ riêng của nó.

+0

Có vẻ như đó là trường hợp! Tôi đã nhìn thấy trang đó nhưng hy vọng ai đó đã đưa ra giải pháp của riêng họ! – theChumpus

+0

@theChumpus, Alex, Bạn đã sử dụng lib ffmpeg phù thủy chưa? Bạn đã sử dụng bất kỳ một lib biên dịch chưa? Bạn đã thử video h264 phát trực tiếp chưa? – Derzu

+0

@Derzu Tôi đã biên soạn ffmpeg trong Unix như chúng làm tại http://code.google.com/p/dolphin-player/. Nó chơi h264 có. –

1

Bạn cũng có thể phát trực tiếp qua udp: // bằng thư viện Vitamio (nó sử dụng ffmpeg phía sau hậu trường). http://www.vitamio.org/en/

+0

Tôi đã xóa bài đăng trước đó của mình, vì tôi đã thử nghiệm vitamio trên máy tính bảng của mình (nexus-7) và nó hoạt động tốt. – user1767754

+0

bạn có thể kiểm tra https://stackoverflow.com/questions/45521175/vitamio-unable-to-play-udp-streaming-in-android không? –

+0

Tôi sẽ phải tìm mã POC cho một dự án cụ thể mà tôi đã làm cách đây 4 năm; Tôi không có công việc thực tế đã được thực hiện cho điều này tất nhiên, vì tôi không sở hữu nó. Không hứa hẹn gì, nhưng tôi sẽ nhìn. –

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