1. 程式人生 > >Android-接收UDP TS流實現邊快取邊播放

Android-接收UDP TS流實現邊快取邊播放

Android播放本地檔案視訊是硬解,這樣對CPU佔用比較少,所以將直播收到的資料臨時快取3個檔案,給定每個檔案的大小,然後進行播放。後續還會進行優化。

具體實現程式碼如下:

  1. package com.cayden.videodemo;  
  2. import java.io.File;  
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5. import java.net.DatagramPacket;  
  6. import java.net.DatagramSocket;  
  7. import android.app.Activity;  
  8. import
     android.app.ProgressDialog;  
  9. import android.content.Intent;  
  10. import android.media.MediaPlayer;  
  11. import android.media.MediaPlayer.OnCompletionListener;  
  12. import android.media.MediaPlayer.OnErrorListener;  
  13. import android.media.MediaPlayer.OnPreparedListener;  
  14. import android.os.Bundle;  
  15. import android.os.Environment;  
  16. import android.os.Handler;  
  17. import android.os.Message;  
  18. import android.util.Log;  
  19. import android.view.View;  
  20. import android.widget.MediaController;  
  21. import android.widget.TextView;  
  22. import android.widget.VideoView;  
  23. import com.cayden.videodemo.R;  
  24. /** 
  25.  *  
  26.  *  接收UDP TS流實現邊快取邊播放<br/> 
  27.  * 該類可以實現,但存在以下不足<br/>
     
  28.  * 1、播放過程會稍微卡一下這是 由於播放時候setOnCompletionListener中方法被執行<br/> 
  29.  * 2、需要思考怎麼解決呼叫onError方法 
  30.  * @author cuiran 
  31.  * @version 1.0.0 
  32.  */
  33. publicclass UDPFileMPlayer extends Activity {  
  34.     privatestaticfinal String TAG="UDPFileMPlayer";  
  35.     private VideoView mVideoView;  
  36.     private TextView tvcache;  
  37.     private String remoteUrl;  
  38.     private String localUrl;  
  39.     private ProgressDialog progressDialog = null;  
  40.     private Thread receiveThread=null;  
  41.     /** 
  42.      * 定義了初始快取區的大小,當視訊載入到初始快取區滿的時候,播放器開始播放, 
  43.      */
  44.     privatestaticfinalint READY_BUFF = 1316 * 1024*10;  
  45.     privatestaticfinal String FILE_DIR=Environment.getExternalStorageDirectory().getAbsolutePath()+"/VideoCache/";  
  46.     /** 
  47.      * 核心交換快取區,主要是用來動態調節快取區,當網路環境較好的時候,該快取區為初始大小, 
  48.      * 當網路環境差的時候,該快取區會動態增加,主要就是為了避免視訊播放的時候出現一卡一卡的現象。 
  49.      */
  50.     privatestaticfinalint CACHE_BUFF = 10 * 1024;  
  51.     /** 
  52.      * 單播或組播埠 
  53.      */
  54.     privatestaticfinalint PORT = 1234;  
  55.     privateboolean isready = false;  
  56.     privateboolean iserror = false;  
  57.     privateint errorCnt = 0;  
  58.     privateint curPosition = 0;  
  59.     privatelong mediaLength = 0;  
  60.     privatelong readSize = 0;  
  61.     @Override
  62.     protectedvoid onCreate(Bundle savedInstanceState) {  
  63.         super.onCreate(savedInstanceState);  
  64.         setContentView(R.layout.bbvideoplayer);  
  65.         findViews();  
  66.         init();  
  67.         playvideo();  
  68.     }  
  69.     /** 
  70.      * 初始化元件 
  71.      * 2013-11-21 下午2:20:10 
  72.      * 
  73.      */
  74.     privatevoid findViews() {  
  75.         this.mVideoView = (VideoView) findViewById(R.id.bbvideoview);  
  76.         this.tvcache = (TextView) findViewById(R.id.tvcache);  
  77.     }  
  78.     privatevoid init() {  
  79.         Intent intent = getIntent();  
  80.         this.remoteUrl = intent.getStringExtra("url");  
  81.         System.out.println("remoteUrl: " + remoteUrl);  
  82.         if (this.remoteUrl == null) {  
  83.             finish();  
  84.             return;  
  85.         }  
  86. //      this.localUrl = intent.getStringExtra("cache");
  87.         mVideoView.setMediaController(new MediaController(this));  
  88.         mVideoView.setOnPreparedListener(new OnPreparedListener() {  
  89.             publicvoid onPrepared(MediaPlayer mediaplayer) {  
  90.                 Log.i(TAG, "onPrepared");  
  91.                 dismissProgressDialog();  
  92.                 mVideoView.seekTo(curPosition);  
  93.                 mediaplayer.start();  
  94.             }  
  95.         });  
  96.         mVideoView.setOnCompletionListener(new OnCompletionListener() {  
  97.             publicvoid onCompletion(MediaPlayer mediaplayer) {  
  98.                 Log.i(TAG, "onCompletion"+localUrl);  
  99. //              curPosition = 0;
  100.                 if(localUrl.endsWith("1.mp4")){  
  101.                     localUrl=localUrl.replace("1.mp4""2.mp4");  
  102.                     mVideoView.setVideoPath(localUrl);  
  103.                     mVideoView.start();  
  104.                 }elseif(localUrl.endsWith("2.mp4")){  
  105.                     localUrl=localUrl.replace("2.mp4""3.mp4");  
  106.                     mVideoView.setVideoPath(localUrl);  
  107.                     mVideoView.start();  
  108. 相關推薦

    Android-接收UDP TS實現快取播放

    Android播放本地檔案視訊是硬解,這樣對CPU佔用比較少,所以將直播收到的資料臨時快取3個檔案,給定每個檔案的大小,然後進行播放。後續還會進行優化。具體實現程式碼如下:package com.cayden.videodemo;  import java.io.File; 

    Android實現MP4下邊播(快取播放、線上播放)原理與程式碼

    QQ群交流:425219113(計算機語言交流) 邊下邊播方法初試 **剛開始實現這個的時候,我第一下想到的是:**先將MP4檔案單純的從位元組的層次分為若干個檔案,然後播放的時候,不斷從伺服器一邊下載,一邊追加到一個原始檔裡面,最後直接播放這個原始檔就可

    Android使用LruCache、DiskLruCache實現圖片快取+圖片瀑布

    PPS:本文僅用於學習利用LruCache、DiskLruCache圖片快取策略、實現瀑布流和Matix檢視大圖縮放移動等功能,如果想用到專案中,建議用更成熟的框架,如glide、picasso 等。 先上效果圖: ###圖片瀑布流 這個用

    android快取播放mp4

    在做一個新聞系統中間有視訊播放的要求,當時想著非常簡單,android的mediaplayer封裝的非常好了,基本就是做做介面。 介面寫好的時候才發現悲劇了,對方伺服器是http方式提供的mp4,android死活無法邊快取邊播放,快取到100%才能播放。 在網上找了找資料,網上有個邊下載mp3邊播放

    使用live555 VLC傳送接收視訊TS

    從中可以看出,對於轉碼的需求,也僅僅是添加了藍色的一段options而已--sout "#transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:duplicate{dst=display,dst=standard{mux=ts{pid-vid

    Android視訊播放快取播放

    轉載地址:http://blog.zhourunsheng.com/2012/05/android%e8%a7%86%e9%a2%91%e6%92%ad%e6%94%be%e4%b9%8b%e8%be%b9%e7%bc%93%e5%ad%98%e8%be%b9%e6%92%ad%e6%94%be/ 最近在做

    修改ffmpeg原始碼,並用它對多路節目TS解複用及播放

    原始碼地址會在這裡告訴大家https://edu.csdn.net/course/play/8542 目前,很多所謂的萬能播放器都沒有新增對多路視訊流視訊的支援。 DVB數字電視經常是多路複用的視訊流,如下圖用vlc播放一個多路視訊的視訊時,播放器首先要解析到所有節目資訊

    如何將衛星電視信號轉成TS Over UDP網絡實現手機APP播放

    APP播放 4k高清 M3U8流 P2P流媒體 隨著網絡寬帶業務和數字電視的普及,家家戶戶都已經在用IPTV/OTT-TV的方式來看電視節目。但是從音視頻的畫面質量來看,廣電系統的電視信號質量最佳,可以真正實現1080P網絡電視畫面質量甚至是H.265 HEVC的4K超高清。

    Android 實現視屏播放器、快取功能,附原始碼

    來源:http://www.apkbus.com/blog-938789-76574.html效果開源播放器選擇Android上最為人熟知的MediaPlayer,對,就是這貨,在上兩篇音訊文章中頻頻露臉的傢伙,這次又有它的身影,然而還是這次不講他,就連他的封裝類VideoV

    node.js 利用實現讀寫同步,

    write 使用 類型 同步 node.js tar 利用 關閉 console //10個數 10個字節,每次讀4b,寫1b let fs=require("fs"); function pipe(source,target) { //先創建可讀流,再創

    text-stroke實現文字描(鏤空)、text-fill-color實現文字填充&漸變(+animation實現光字體)

    stroke 顏色 width mas key ani kit mat idt text-stroke:<‘ text-stroke-width ‘> || <‘ text-stroke-color ‘>(text-stroke-width:設置或檢

    Android 自定義View-----式佈局(粗糙實現)

    //首先檢視一下佈局介面吧 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app

    前端接收資料實現圖片預覽效果--ajax 請求二進位制 圖片 檔案 XMLHttpRequest 請求並處理二進位制資料 之最佳實踐

    本文為轉載文章 原文連結:https://www.cnblogs.com/cdemo/p/5225848.html 首先要謝謝這位大神的無私貢獻!解決了我的問題也完美表達了我當時的心路歷程 ajax 請求二進位制流 圖片 檔案 XMLHttpRequest 請求並處理二進位制流資料 之最佳實踐

    Android 實現錄音探究

    場景描述 音樂中只有一種聲音有時候很單薄的,我們經常希望把不同的聲音加在一起,但是在錄製的時候我們需要嚴格同步起來,把兩種聲音的時差控制在聽覺允許的範圍內,才可能獲得我們想要的結果。另外一點,在錄製的時候,為了不把播放的聲音和人聲或者器樂聲混到一塊,通常都需要錄製者帶著耳機邊聽邊錄。 為了實現最終兩個或

    android自定義View之仿通訊錄側欄滑動,實現A-Z字母檢索

    我們的手機通訊錄一般都有這樣的效果,如下圖: OK,這種效果大家都見得多了,基本上所有的android手機通訊錄都有這樣的效果。那我們今天就來看看這個效果該怎麼實現。 一.概述 1.頁面功能分析 整體上來說,左邊是一個ListView,右邊是一個自定義View,但

    Android音視訊】TS資料解析和Jni2Java回撥

    為了解析傳輸到手機的TS流有效視訊資料,進行預覽播放和錄製等功能,在網上看到的部分關於android播放TS流,如UDP預覽播放,採取的方式真是夠標新立異,如通過儲存到本地ts檔案然後播放,會有閃屏現象等,當然也有很多的播放器支援播放,如ffmepg-and

    Android ListView功能擴充套件,實現高效能的瀑布佈局

    經過前面兩篇文章的學習,我們已經對ListView進行了非常深層次的剖析,不僅瞭解了ListView的原始碼和它的工作原理,同時也將ListView中常見的一些問題進行了歸納和總結。那麼本篇文章是我們ListView系列三部曲的最後一篇,在這篇文章當中我們將對ListView

    Android實現圖片快取與非同步載入

    ImageManager2這個類具有非同步從網路下載圖片,從sd讀取本地圖片,記憶體快取,硬碟快取,圖片使用動畫漸現等功能,已經將其應用在包含大量圖片的應用中一年多,沒有出現oom。 Android程式常常會記憶體溢位,網上也有很多解決方案,如軟引用,手動呼叫recycle

    vlc使用udp組播方式傳送ts的特殊規則

    當你寫程式去接收vlc傳送的ts流時,你會發現解析出來的一幀視訊幀有時候解碼會失敗,追究其原因,是因為前4個位元組不是0,0,0,1。 那為什麼會這樣呢? 這是因為vlc在處理大於65535位元組的視訊幀時,沒有按照ISO標準來。 ISO標準的做法是將PES_packe

    Android中Recyclerview使用13----實現瀑布遇到的各種問題(item移動,載入更多圖片閃爍,以及定製各種型別Header和Footer)

    功能:圖片瀑布流 問題1:如何保持已顯示過的imageview的尺寸 解決方法:定義一個HashMap<Integer, Float> indexMap = new HashMap<Integer, Float>();用來儲存已顯示過的Ima