vlc android demo,使用VLC-Android寫一個簡單的電視直播demo
使用VLC-Android寫一個簡單的電視直播demo
近兩年每天各種新的“干貨”出來,可以說真的是百花齊放百家爭鳴,每天也有各種各樣不同的文章在簡書和各大平台上嶄露頭角。而我就比較吃虧了,寫文章容易詞窮,文字功底一般,對於技術性的文字,也就記錄記錄流水賬,再加上我本來就沒有什么技術功底和學術功底,寫不出什么干貨文來,所以距離上一次寫博客文章已經過去很久很久以前的事情了。
前一陣子我買了一個電視盒子,所以我想寫個電視應用,沒事可以在盒子上安裝自己可控的電視應用,自己維護電視頻道,所以我開始着手做這件事情。
所以本文就是我就隨手記錄一下開發的思考過程,本文是最簡單的入門文,大牛們可以繞開此文。
准備工作
首先其一,要想一下如何做一個簡單的直播播放器的demo.
我們考慮一下,做一個電視直播應用需要哪些需求。
1、有好多台
2、能看直播頻道
3、能裝到盒子上
詳細一點的需求
再詳細一點說就是:
1、能維護一個電視頻道列表
2、能夠播放直播的流媒體視頻,並且能夠兼容多種流媒體視頻協議和視頻封裝和編碼格式
3、能安裝到多種硬件平台的Android盒子上
技術要求和實現
我們可以看到,這玩意兒的業務邏輯實在是再簡單不過了,只是個demo嘛。
首先看第一個,一個列表,相當簡單,維護一個ListView,並且用一個數據表來緩存這個列表,就OK了,毫無干貨。
先跳過第二個,看第三個,因為第二個看起來好麻煩的樣子。
第三個,我感覺這些便宜的盒子大多數是armv7a的硬件平台,最低系統版本是4.4,所以我們的應用只要考慮在這上面能夠播放視頻流就可以了。
回過頭來看最主要的要求,首先,我們要支持的是視頻格式。現在大多數硬件平台應該是可以輕松支持H.264,1080P,30fps的視頻解碼,包括硬件解碼和軟件解碼,而現在的流媒體視頻大多數是這種方式編碼傳輸,當然,不排除使用MPEG2格式的視頻。不管是硬件解碼還是軟件解碼,只要能解碼,就是好碼。嗯。
前面說啰嗦了,簡言之,只要是流媒體視頻,我們只要考慮能夠支持以下編碼即可:
H.264, MPEG2, ,稍微好點的可以支持H.265。
支持的分辨率大小,我想現在沒有不支持1080P的吧,那么1080P以下應該是沒有問題的。
幀率要達到30fps就不用說了。
另外,上面說的只是視頻編碼格式。還沒有提到流傳輸協議。我們最常見的有三種:
rtsp, hls, rtmp. Android系統的多媒體框架本身已經對除了rtmp以外的流媒體協議和視頻格式都已經有所支持,但是問題在於支持的程度根據硬件平台不同行為可能有些許不同。所以在繼續下去之前,我希望能夠保證這三種協議都能夠被我的demo所支持,因為rtmp協議的視頻流並不在少數。所以,我並不計划使用系統本身的媒體框架來做。我選用ijkplayer或者vlc來使用。
對比ijkplayer和vlc,兩個都是在ffmpeg基礎上進行開發的媒體框架,各自有各自的長處。我在測試時更加推薦ijkplayer,因為它的性能表現和軟硬解碼的切換的靈活性十分好,並且支持SurfaceView, TextureView可更換渲染視頻,並且可以選擇使用OpenGLES渲染視頻。ijkplayer解析和使用已有很多文章說明,其本質是SDL配合FFMPEG渲染解碼。但是昨天發生了一件以外情況,對於我想要快速原型的願望有所顧慮。ijkplayer在樂視2手機上報了一個(-10000,0)錯誤,官方issue中也有很多相同問題的人,但是並沒有解決這個問題。因此只好更換了VLC-android來構建這個demo。
老實說,我在Ubuntu下移植構建ffmpeg和vlc都遇到過很多麻煩,走過很多彎路。但是我希望能夠快速實現我的目的,所以我還是找到了別人提前編譯好的依賴包來使用,我只拿api來使用。當然我在使用vlc-android期間也走了一點彎路,被所謂的MediaPlayer-like API思維禁錮的我各種報錯運行不成功,結果我不撞南牆不回頭,索性繞開這個坑,找了使用范例來寫。
首先我建了一個android項目,並且在build.gradle文件當中加入已經編譯好的依賴。這個依賴來自於:
https://github.com/mrmaffen/vlc-android-sdk,根據上面的說明,加入
dependencies {
compile "de.mrmaffen:vlc-android-sdk:2.0.6"
}
readme當中依然提到了如果想自己構建,如何做如何做。自己構建?有空再說。
我們可以直接開始使用VLC庫的API了。
以下代碼我只寫出關鍵代碼,其余的多余代碼為了不干擾實現,不貼出來。
首先,我們要有一個SurfaceView表面來顯示渲染內容:
android:layout_width="match_parent"
android:layout_height="210dp" />
然后需要兩個按鈕
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="QTV1" />
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="QTV2"
android:visibility="visible" />
作為兩個頻道切換
實在不能再簡單了,然后上我們的Java代碼,在Activity中,我們需要這么使用:
//需要導入的包,不要用錯包的MediaPlayer類
import org.videolan.libvlc.LibVLC;
import org.videolan.libvlc.Media;
import org.videolan.libvlc.MediaPlayer;
//在Activity中可以為按鈕增加事件
SurfaceView srfc;
LibVLC libVLC = null;
ArrayList options = new ArrayList<>();
libVLC = new LibVLC(getApplication(), options);
try {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
mediaPlayer = new MediaPlayer(libVLC);
String url = getString(R.string.http_video11_qtv_com_cn_qtv1_sd_manifest_m3u8);
//
mediaPlayer.getVLCVout().setVideoSurface(srfc.getHolder().getSurface(), srfc.getHolder());
//播放前還要調用這個方法
mediaPlayer.getVLCVout().attachViews();
Media media = new Media(libVLC, Uri.parse(url));
mediaPlayer.setMedia(media);
mediaPlayer.play();
} catch (Exception e) {
e.printStackTrace();
}
並且
@Override
protected void onPause() {
super.onPause();
if (mediaPlayer != null) {
mediaPlayer.pause();
}
}
@Override
protected void onResume() {
super.onResume();
if (mediaPlayer != null) {
mediaPlayer.play();
}
}
然后就可以使用了
vlc android demo,使用VLC-Android寫一個簡單的電視直播demo相关推荐
- android fragment 管理器,Android Fragment 與 Fragment管理器
Android Fragment 與 Fragment管理器 首先談談Fragement的需求 過去開發人員認為界面之間的跳轉只需要使用多個activity組成就行了: 例如下圖中,在Activity ...
- android jni 中jnienv,android JNI中JNIEnv類型和jobject類型的解釋
JNIEXPORT void JNICALL Java_com_jni_demo_JNIDemo_sayHello (JNIEnv *env, jobject obj) { cout< } 對於 ...
- android 联系人 字母索引,Android ListView字母索引(仿微信通訊錄列表)
布局代碼 xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_paren ...
- 遊戲是這樣寫成的 (第三篇: 簡單的遊戲框架)
遊戲是這樣寫成的 (第三篇: 簡單的遊戲框架) 通過上一篇, 我們已有個基本的畫圖功能, 這次讓我們弄一個簡單的遊戲框架吧! 其實一般的遊戲, 大至有兩個主要的函數就可以了: update 和 ren ...
- 【轉】一個在台積電工作3年的工程師寫給學弟學妹們的信
一個在台積電工作3年的工程師寫給學弟學妹們的信 看到一群研究生小朋友在這里爭排名,爭校名,覺得很幼稚,很不切實際.你們可曾想過,橫在各位前面的,有更復雜,更可怕的問題?那就是生涯規劃以及就業.問各位幾 ...
- android vlc rtsp卡顿,VLC播放器 RTSP 卡顿解决
之前写过一篇关于在Linux平台上编译android平台上VLC播放器源代码的文章,vlc这款播放器非常优秀而且是开源的,它的核心是开源视频编解码库ffmpeg.而且这款播放器还支持RTSP协议,这个 ...
- android vlc使用教程_在android项目中使用VLC
VLC是pc时代流媒体播放器的标杆,相信大家都有接触.VLC的流媒体部分是基于开源的live555库.live555的代码我稍微看过一些,基于C++的,说实话,代码写的有点乱,不太符合一个开源库的档次 ...
- 一个Demo学完Android中所有的服务
注:这个例子来自"安卓巴士",经阅读,理解,写此文章 说明:这个例子实现了Android中常见的许多服务,下面是实现的截图 接下来,以源代码的方式分析这个例子 1.MainActi ...
- 一个Demo学会用Android兼容包新控件
2019独角兽企业重金招聘Python工程师标准>>> 前言 伟大的Google为Android推出了一系列的兼容包,最新的就是Design Support Library了,这里我 ...
最新文章
- Centos设置开机启动Apache和Mysql[总结]
- 架构师实践日 11.9 南京站报名 | 技术大牛带你剖析大数据平台内部演进中的挑战与实践...
- 5G NGC — 关键技术 — R15 SBA
- Windows平台SSH登录Linux并使用图形化界面
- Spring Cloud构建微服务架构:分布式服务跟踪(入门)
- Linux下如何可写挂载ntfs分区
- 数据库系统的三级模式结构知识笔记
- 【linux】设置镜像源
- 位置路径 usb 获取_USB4规范解读(二):详解USB4的传输路径
- mysql 5.7和8.0区别_SpringBoot 2.0 教程实战 MySQL 读写分离
- Linux软件包管理神器--YUM
- 视频编码中的PAFF和MBAFF的区别 转自:http://blog.csdn.net/kerryhung/article/details/4433256...
- Mac 禁止插上手机自动启动iTunes
- SCCM通过PXE部署系统蓝屏Recovery
- 浅谈海明码,码距及其计算问题(看过的都明白了)
- FairMOT多目标跟踪(安装+代码解读)
- Kerberos协议简介
- linux mmc 读写,linux内核mmc读写分析
- android 轮换实现动画,怎么在Android中实现一个首页无限轮播功能
- 大数据开发工程师都需要学什么?
热门文章
- 《悠悠岁月》安妮·埃尔诺
- Qt商业组件Qtitan系列大更新:适用于Qt5.15.2和Visual Studio2019
- Luat Demo | 给我十分钟,教你实现Cat.1语音通话功能!
- 词根词缀前缀总结(一)
- 港科夜闻|香港科大与香港科大(广州)管理层联席会议顺利召开
- Java AWT中常用的三种布局管理器
- 快速打开CMD的几个方法
- 机器人制作开源方案 | Delta型腿机器狗实现原地动作
- Unity3D学习笔记(4)—— 牧师和魔鬼游戏
- 皮尔森 统计学相关性分析_pearson相关系数和spearman相关系数的区别