2011-11-29 242 views
6

我有一個Android項目,我需要構建一個客戶端應用程序來接收UDP或RTP單播視頻流並播放它們。不幸的是,我似乎無法得到這個工作,並已廣泛搜索解決方案!Android上的UDP視頻流

我正在Xoom(Android 3.2)和Nexus S(Android 2.3.6)上進行測試,並且知道他們可以在使用MX Player(第三方媒體播放器應用程序)作爲客戶端時播放內容,但我無法讓本地媒體播放器播放內容。我曾嘗試使用簡單的VideoView和MediaPlayer,但都使用相同的錯誤代碼失敗,我無法找到任何有用的信息。

該視頻是H.264編碼的aac音頻。

此外,服務器是我無法訪問的第三方解決方案(除指定udp或rtp外),但正如我所說的,使用MX Player時,可以播放流。

這裏是我的代碼的媒體播放器部分:

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(); 
    } 
} 

我收到的錯誤是:

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) 

我還設置了互聯網的權限。

請問有誰有任何建議?我找不到任何有用的信息。

謝謝。

+0

您是否嘗試過使用'player.prepareAysnc()'而不是'player.prepare()'?播放流時,您應該使用'prepareAsync()'。 – Squonk

回答

3

我不知道Android的原生支持UDP,因爲它不是在網絡協議

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

許多第三方mediaplayers是基於FFmpeg的庫上市。你可能想在你的項目中使用FFMPEG,儘管這是它自己的一項任務。

+0

是的,它似乎是這種情況!我看過那個頁面,但希望有人想出了他們自己的解決方案! – theChumpus

+0

@ theChumpus,Alex,你用過女巫ffmpeg庫嗎?你有沒有使用任何一個預編譯的庫?你有沒有試過流h264視頻? – Derzu

+0

@Derzu我在Unix下編譯了ffmpeg,就像他們在http://code.google.com/p/dolphin-player/上一樣。它播放h264是的。 –

1

您也可以通過udp://使用Vitamio庫進行流式處理(它在後臺使用ffmpeg)。 http://www.vitamio.org/en/

+0

我刪除了我以前的帖子,因爲我在我的平板電腦(nexus-7)上測試了vitamio,它運行良好。 – user1767754

+0

你能不能檢查https://stackoverflow.com/questions/45521175/vitamio-unable-to-play-udp-streaming-in-android? –

+0

我將不得不爲4年前完成的特定項目尋找我​​的POC代碼;因爲我沒有擁有它,所以我沒有爲此做實際的工作。不作任何承諾,但我會看。 –