基于VLC的視頻播放器
最近在研究視頻播放的功能,之前是使用VideoView。在網(wǎng)上看了一下,感覺不是很好,支持的格式比較少,現(xiàn)在網(wǎng)絡(luò)視頻的格式各種各樣,感覺用VideoView播放起來局限性很大。
找到了一個比較合適的播放器,Github地址為https://github.com/xiaomo/AndroidPlayerLibrary 。這個播放器是基于vlc這個軟件,在將我們的demo導(dǎo)入到Eclipse中之后,可以發(fā)現(xiàn),這樣一個libvlc文件夾。
在Media這個類中我們可以發(fā)現(xiàn),這些是支持的格式還是比較多的。
- String[] video_extensions = {
- ".3g2", ".3gp", ".3gp2", ".3gpp", ".amv", ".asf", ".avi", ".divx", ".drc", ".dv",
- ".f4v", ".flv", ".gvi", ".gxf", ".ismv", ".iso", ".m1v", ".m2v", ".m2t", ".m2ts",
- ".m4v", ".mkv", ".mov", ".mp2", ".mp2v", ".mp4", ".mp4v", ".mpe", ".mpeg",
- ".mpeg1", ".mpeg2", ".mpeg4", ".mpg", ".mpv2", ".mts", ".mtv", ".mxf", ".mxg",
- ".nsv", ".nut", ".nuv", ".ogm", ".ogv", ".ogx", ".ps", ".rec", ".rm", ".rmvb",
- ".tod", ".ts", ".tts", ".vob", ".vro", ".webm", ".wm", ".wmv", ".wtv", ".xesc" };
- String[] audio_extensions = {
- ".3ga", ".a52", ".aac", ".ac3", ".adt", ".adts", ".aif", ".aifc", ".aiff", ".amr",
- ".aob", ".ape", ".awb", ".caf", ".dts", ".flac", ".it", ".m4a", ".m4b", ".m4p",
- ".mid", ".mka", ".mlp", ".mod", ".mpa", ".mp1", ".mp2", ".mp3", ".mpc", ".mpga",
- ".oga", ".ogg", ".oma", ".opus", ".ra", ".ram", ".rmi", ".s3m", ".spx", ".tta",
- ".voc", ".vqf", ".w64", ".wav", ".wma", ".wv", ".xa", ".xm" };
在這個例子中它自己寫了一個PlayerActivity和PlayerView,在PlayerView中實(shí)現(xiàn)了libvlc中的IVideoPlayer接口
在PlayerActivity中實(shí)現(xiàn)PlayerView類,從而進(jìn)行界面和流程的控制。
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mUrl = getIntent().getStringExtra("url");
- if (TextUtils.isEmpty(mUrl)) {
- Toast.makeText(this, "error:no url in intent!", Toast.LENGTH_SHORT).show();
- return;
- }
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
- setContentView(R.layout.activity_player);
- mHandler = new Handler(this);
- tvTitle = (TextView) findViewById(R.id.tv_title);
- tvTime = (TextView) findViewById(R.id.tv_time);
- tvLength = (TextView) findViewById(R.id.tv_length);
- sbVideo = (SeekBar) findViewById(R.id.sb_video);
- sbVideo.setOnSeekBarChangeListener(this);
- ibLock = (ImageButton) findViewById(R.id.ib_lock);
- ibLock.setOnClickListener(this);
- ibBackward = (ImageButton) findViewById(R.id.ib_backward);
- ibBackward.setOnClickListener(this);
- ibPlay = (ImageButton) findViewById(R.id.ib_play);
- ibPlay.setOnClickListener(this);
- ibFarward = (ImageButton) findViewById(R.id.ib_forward);
- ibFarward.setOnClickListener(this);
- ibSize = (ImageButton) findViewById(R.id.ib_size);
- ibSize.setOnClickListener(this);
- llOverlay = findViewById(R.id.ll_overlay);
- rlOverlayTitle = findViewById(R.id.rl_title);
- rlLoading = findViewById(R.id.rl_loading);
- tvBuffer = (TextView) findViewById(R.id.tv_buffer);
- //使用步驟
- //***步 :通過findViewById或者new PlayerView()得到mPlayerView對象
- //mPlayerView= new PlayerView(PlayerActivity.this);
- mPlayerView = (PlayerView) findViewById(R.id.pv_video);
- //第二步:設(shè)置參數(shù),毫秒為單位
- mPlayerView.setNetWorkCache(20000);
- //第三步:初始化播放器
- mPlayerView.initPlayer(mUrl);
- //第四步:設(shè)置事件監(jiān)聽,監(jiān)聽緩沖進(jìn)度等
- mPlayerView.setOnChangeListener(this);
- //第五步:開始播放
- mPlayerView.start();
- //init view
- tvTitle.setText(mUrl);
- showLoading();
- hideOverlay();
- }
關(guān)于如何使用這個類庫
庫兩種使用方式:
***種,直接new一個PlayerView或者在布局文件的xml里面嵌入view。
第二種,跳轉(zhuǎn)到一個寫好的播放頁面PlayerActivity (本地文件參數(shù)格式:file:///sacard/test.rmvb。)
這里我選擇了第二種方法
- startActivity(new Intent(this, PlayerActivity.class).putExtra("url", items.get(position)));
通過一個選擇列表的形式,點(diǎn)擊每一項,傳遞一個url到PlayerActivity
選擇列表中的1.2JDK下載.mp4
橫豎屏的切換也是沒有問題的。