在android上,視頻/音頻流直播是極少有人關注的一部分。每當咱們討論流媒體,RTMP(Real Time Messaging Protocol)是不可或缺的。RTMP是一個基本的視頻/音頻直播流協議,可是不幸的是Android標準的VideoView不支持RTMP的播放。所以,若是想在android上播放RTMP直播流,你必須使用支持RTMP協議的庫。 庫播放由 RTMP 協議傳輸的流媒體。html
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
下載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
在講述如何使用以前,讓咱們先了解下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庫。上面的例子會是這個樣子:
服務器
實時流協議(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開發者最多見的問題之一。經過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流效果以下:
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來聯繫咱們獲取更多更新。