Android 如何直播RTMP流

在android上,視頻/音頻流直播是極少有人關注的一部分。每當咱們討論流媒體,RTMP(Real Time Messaging Protocol)是不可或缺的。RTMP是一個基本的視頻/音頻直播流協議,可是不幸的是Android標準的VideoView不支持RTMP的播放。所以,若是想在android上播放RTMP直播流,你必須使用支持RTMP協議的庫。  庫播放由 RTMP 協議傳輸的流媒體。html

Android Vitamio 庫

Vitamio是一個android和ios上基於FFmpeg的開源項目。Vitamio爲咱們提供了一個清潔、簡單、全面、真實的硬件加速解碼器和渲染器API,Vitamio是一個支持多種音視頻格式 如 FLV, TS/TP, WMV, DivX, Xvid等多種標準格式的很是強大的庫。所不一樣的是,它也支持相似.mkv和.srt嵌入和外掛字幕播放。可是它帶有一個許可證,所以在使用它以前請先得到認證。在這個android RTMP例子中,咱們不只討論RTMP直播流,並且也會討論m3u8流(HLS),RTSP流和 MMS (Microsoft Media Stream)。首先讓在咱們的項目中引用Vitamio庫。java

在Android Studio中引用Vitamio庫的步驟以下:

下載Vitamio bundle https://github.com/yixia/VitamioBundle 解壓而且在Android Studio上File->Import Module 指定到VitamioBundle路徑,選擇vitamio文件夾 點擊完成 在build.gradle(Module: app)依賴部分添加依賴項目(‘:vitamio’) 打開build.gradle (Module: vitamio) - 改變最小sdk版本爲7 不要忘記在manifest.xml中添加internet權限 完成!android

Android RTMP流

在講述如何使用以前,讓咱們先了解下RTMP。Real Time Messaging Protocol (RTMP)是一個Adobe Systems所擁有的一個協議。該協議是Adobe公司擁有的開發音視頻流的flash player。後來該協議的部分被公開,供公衆使用。更多請查看這裏.這個協議大多用於IPTV和實時視頻點播流,但它也用於其餘領用。ios

在android上,標準的VideoView不支持RTMP播放。但WebView能夠播放RTMP流。這解決了播放RTMP流的問題,可是我認爲web apps 不能提供一個很好的界面和體驗。所以這這個android RTMP例子中咱們將運用第三方庫-Vitamio 直播RTMP流的流媒體。在工程中引用Vitamio以後,請在你的layout文件添加Vitamio的VideoView:git

activity_main.xmlgithub

?
1
2
3
4
5
6
<code class = "language-xml" hljs= "" >    <!--?xml version= 1.0 encoding=utf- 8 ?-->
     <linearlayout android:layout_height= "match_parent" android:layout_width= "match_parent" android:orientation= "vertical" xmlns:android= "http://schemas.android.com/apk/res/android" >
 
         <io.vov.vitamio.widget.videoview android:id= "@+id/vitamio_videoView" android:layout_height= "wrap_content" android:layout_width= "wrap_content" >
 
     </io.vov.vitamio.widget.videoview></linearlayout></code>

另外請編寫你的activity以下:web

MainActivity.javaandroid-studio

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<code class = "language-java" hljs= "" >    package com.truiton.rtmpplayer;
 
     import android.net.Uri;
     import android.os.Bundle;
     import android.support.v7.app.ActionBarActivity;
 
     import java.util.HashMap;
 
     import io.vov.vitamio.LibsChecker;
     import io.vov.vitamio.MediaPlayer;
     import io.vov.vitamio.widget.MediaController;
     import io.vov.vitamio.widget.VideoView;
 
 
     public class MainActivity extends ActionBarActivity {
         private static final String TAG = MainActivity;
         private String path;
         //private HashMap<string, string=""> options;
         private VideoView mVideoView;
 
         @Override
         protected void onCreate(Bundle savedInstanceState) {
             super .onCreate(savedInstanceState);
             if (!LibsChecker.checkVitamioLibs( this ))
                 return ;
             setContentView(R.layout.activity_main);
             mVideoView = (VideoView) findViewById(R.id.vitamio_videoView);
             path = rtmp: //rrbalancer.broadcast.tneg.de:1935/pw/ruk/ruk;
             /*options = new HashMap<>();
             options.put(rtmp_playpath, );
             options.put(rtmp_swfurl, );
             options.put(rtmp_live, 1);
             options.put(rtmp_pageurl, );*/
             mVideoView.setVideoPath(path);
             //mVideoView.setVideoURI(Uri.parse(path), options);
             mVideoView.setMediaController( new MediaController( this ));
             mVideoView.requestFocus();
 
             mVideoView.setOnPreparedListener( new MediaPlayer.OnPreparedListener() {
                 @Override
                 public void onPrepared(MediaPlayer mediaPlayer) {
                     mediaPlayer.setPlaybackSpeed( 1 .0f);
                 }
             });
         }
     }</string,></code>

雖然上面代碼很清晰明瞭,但須要指出的是請修改你播放RTMP流的路徑。在android上,有時可能使用帶報頭路徑來播放RTMP流。幸運的是,Vitamio RTMP播放器也支持這種方式。所以,全部類型的RTMP流可使用Vitamio庫。上面的例子會是這個樣子:
Rtmpplayer服務器

Android RTSP流媒體

實時流協議(RTSP)經過多媒體服務器傳輸內容,例如YouTube使用RTSP流發佈內容。關於RTSP流比較容易的部分是,它能夠經過android標準的VideoView來完成,想了解更多,請參考個人VideoView例子。網絡

可是若是你使用Vitamio庫,能夠更好的播放RTSP流。事實上Vitamio也支持RTSP流的回播。和上面過程是同樣的,包括Vitamio的VideoView在佈局文件,並使用路徑變量指定的RTSP url

?
1
2
3
4
5
6
7
8
9
10
11
12
<code class = "language-java" hljs= "" >    mVideoView = (VideoView) findViewById(R.id.vitamio_videoView);
     path = rtsp: //wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov;
     mVideoView.setVideoPath(path);
     mVideoView.setMediaController( new MediaController( this ));
     mVideoView.requestFocus();
 
     mVideoView.setOnPreparedListener( new MediaPlayer.OnPreparedListener() {
         @Override
         public void onPrepared(MediaPlayer mediaPlayer) {
             mediaPlayer.setPlaybackSpeed( 1 .0f);
         }
     });</code>

Android m3u8 流媒體

「如何在android上播放m3u8視頻」是android開發者最多見的問題之一。經過Http 協議進行視頻流直播最簡單的辦法就是使用標準的 VideoView. 但只能在android3.0以上的設備上播放m3u8流。由於在Android 3.0引入HTTP/ HTTPS直播和HTTP/ HTTPS漸進式流媒體協議,在android3.1徹底支持HTTPS。

若是你但願在早期的版本上實現支持android m3u8流的HTTP實時流媒體 (HLS)。應該考慮使用Vitamio庫,這個庫支持在android API7以上播放m3u8。使用方式,一樣的在佈局文件中使用Vitamio的VideoView,並指定的HTTP實時流媒體URL。

?
1
2
3
4
5
6
7
8
9
10
11
12
<code class = "language-java" hljs= "" >    mVideoView = (VideoView) findViewById(R.id.vitamio_videoView);
     path = http: //93.184.221.133/00573D/236/236-0.m3u8;
     mVideoView.setVideoPath(path);
     mVideoView.setMediaController( new MediaController( this ));
     mVideoView.requestFocus();
 
     mVideoView.setOnPreparedListener( new MediaPlayer.OnPreparedListener() {
         @Override
         public void onPrepared(MediaPlayer mediaPlayer) {
             mediaPlayer.setPlaybackSpeed( 1 .0f);
         }
     });</code>

Playing m3u8 stream on Android with Vitamio would look something like this:
在androi上使用Vitamio播放m3u8流效果以下:
m3u8

Android MMS 流

Vitamio庫是一個強大的庫,還支持Microsoft媒體服務器(MMS)流中的播放。 MMS是網絡流媒體協議,主要用於網絡廣播和電臺直播。使用Vitamio用於在anroid的MMS流和其餘協議沒有什麼不一樣。全部你須要作的只是更換路徑變量指向一個MMS url:

?
1
2
3
4
5
6
7
8
9
10
11
12
<code class = "language-java" hljs= "" >    mVideoView = (VideoView) findViewById(R.id.vitamio_videoView);
     path = mms: //beotelmedia.beotel.net/studiob;
     mVideoView.setVideoPath(path);
     mVideoView.setMediaController( new MediaController( this ));
     mVideoView.requestFocus();
 
     mVideoView.setOnPreparedListener( new MediaPlayer.OnPreparedListener() {
         @Override
         public void onPrepared(MediaPlayer mediaPlayer) {
             mediaPlayer.setPlaybackSpeed( 1 .0f);
         }
     });</code>

結論

經過上面的討論,能夠肯定地說,Vitamio是一個強大的多平臺庫(ios and android)。經過使用Vitamio庫 能播放多種類型的視頻格式和協議如RTMP, RTSP, HTTP Live, and HTTP漸進式流協議。另一個很好的功能是,vitamio支持字幕和多音軌的播放。Vitamio的惟一的缺點是,它不是徹底的開源。您可能須要購買許可證來使用它。但願這會有所幫助。經過Facebook, Google+ and Twitter來聯繫咱們獲取更多更新。

相關文章
相關標籤/搜索