近段時間,電視家不能用了,好吧,自己開發一個APP。其實也不是開發,而是基于現有的播放器核心自己封裝一個,只要能夠非常方便操作觀看電視就好。
當然,前提是要有節目源,這個我早已完成:通過OpenWRT用udpxy將IPTV信號轉換為HTTP單播協議融合到了家里的局域網中。
基于哪一款播放器核心來封裝,其實有很多選擇:VLC、ExoPlayer、IjkPlayer、安卓自帶的控件VideoView。
我首先使用的是VLC,因為這款播放器我用得最多,在Windows平臺上,我也用C#基于它封裝了一個播放器,平時坐在電腦前一邊做事,一邊通過這個封裝的播放器看看電視。
封裝的關鍵步驟為:
1、按常規步驟新建android項目,Empty View類型的項目就好。
2、為項目添加VLC支持庫。修改 build.gradle.kts 文件,在依賴項中添加:
dependencies {
??? implementation("org.videolan.android:libvlc-all:3.5.1")
??? ……
}
這里的版本號可以適時修改。
3、給項目APP授予網絡訪問的權限。在AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.INTERNET" />
4、添加播放器的顯示組件。在APP主界面的視圖配置文件activity_main.xml中添加:
<SurfaceView
??????? android:id="@+id/surfaceView"
??????? android:layout_width="match_parent"
??????? android:layout_height="match_parent" />
5、聲明初始化基于VLC的播放器核心組件,并將視頻顯示關聯到控件:
??????? ArrayList<String> options = new ArrayList<>();
??????? options.add("--rtsp-tcp");
??????? options.add("--live-caching=200");
??????? LibVLC libVLC = new LibVLC(this, options);
??????? MediaPlayer mediaPlayer = new MediaPlayer(libVLC);
??????? SurfaceView surfaceView = findViewById(R.id.surfaceView);
??????? mediaPlayer.getVLCVout().setVideoView(surfaceView);
??????? mediaPlayer.getVLCVout().setWindowSize(surfaceView.getWidth(), surfaceView.getHeight());
??????? surfaceView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
??????????? @Override
??????????? public void onLayoutChange(View view, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
??????????????? mediaPlayer.getVLCVout().setWindowSize(right-left, bottom-top);
??????????? }
??????? });
??????? mediaPlayer.getVLCVout().attachViews();
6、播放網絡視頻:
??? public void play(String url){
??????? if(libVLC != null && mediaPlayer != null){
??????????? Media media = new Media(libVLC, Uri.parse(url));
??????????? mediaPlayer.setMedia(media);
??????????? media.release();
??????????? mediaPlayer.play();
??????? }
??? }
通過以上關鍵步驟,即可正常播放局域網中IPTV的單播信號。最初在我的AS開發環境的模擬器和我備用手機上測試時,一切正常,換臺也很快。但程序安裝到我的小米電視后,播放效果就不盡人意了。圖像有點灰,部分頻道播放正常,但CCTV3、6、湖南衛視、經視等頻道只有聲音,圖像無法正常顯示,嘗試過各種辦法也沒有解決。最后,我將VLC原版程序安裝到我的小米電視后,問題依舊,那就說明不是我封裝的問題了。可能是因為我的小米電視太老舊,2014年的產品,API還是18。
我不得不嘗試換一種播放器,然后開始嘗試ExoPlayer,封裝的步驟與VLC的類似,甚至更簡單,在模擬器和手機上測試時,所有頻道都能正常播放,但大部分頻道無聲音,CCTV3、6、湖南衛視、經視等頻道卻能正常播放。嘗試安裝到小米電視時,又遇到問題,在編譯minSDK=18的APP版本時,總是報錯,一直沒辦法解決。
然后,我又嘗試其他的播放器,如IjkPlayer,但更容易遇到一些無法解決的問題。在不停的嘗試中,也試過VideoView,這個Android自帶的控件,代碼更簡單,但在模擬器上一直沒辦法播放。總是顯示“無法播放此視頻“。在日志輸出中,顯示:
mapper 4.x is not supported
一次偶然的機會,在手機上測試,居然播放正常。然后在我的小米電視上測試,居然所有的頻道都正常,很是意外。回頭再去查前面的錯誤,有解釋說是需要arm,引用的圖形庫libnative-igraphics.so只存在于arm64-8a和armeabi-v7a這個兩個目錄,x86核心的模擬器不能找到文件而無法播放。
這真是:踏破鐵鞋無覓處,得來全不費功夫。最后給我的感覺應該是:VLC在x86-64的平臺上性能最好;Andorid自帶的VideoView組件使用了自己系統最底層的東西,在arm平臺中性能最好;其他的一些開源的播放器,還需要努力!