Android播放本地文件视频是硬解,这样对CPU占用比较少,所以将直播收到的数据临时缓存3个文件,给定每个文件的大小,然后进行播放。后续还会进行优化。
具体实现代码如下:
package com.cayden.videodemo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.MediaController;
import android.widget.TextView;
import android.widget.VideoView;
import com.cayden.videodemo.R;
/**
*
* 接收UDP TS流实现边缓存边播放
* 该类可以实现,但存在以下不足
* 1、播放过程会稍微卡一下这是 由于播放时候setOnCompletionListener中方法被执行
* 2、需要思考怎么解决调用onError方法
* @author cuiran
* @version 1.0.0
*/
public class UDPFileMPlayer extends Activity {
private static final String TAG=”UDPFileMPlayer”;
private VideoView mVideoView;
private TextView tvcache;
private String remoteUrl;
private String localUrl;
private ProgressDialog progressDialog = null;
private Thread receiveThread=null;
/**
* 定义了初始缓存区的大小,当视频加载到初始缓存区满的时候,播放器开始播放,
*/
private static final int READY_BUFF = 1316 * 1024*10;
private static final String FILE_DIR=Environment.getExternalStorageDirectory().getAbsolutePath()+”/VideoCache/”;
/**
* 核心交换缓存区,主要是用来动态调节缓存区,当网络环境较好的时候,该缓存区为初始大小,
* 当网络环境差的时候,该缓存区会动态增加,主要就是为了避免视频播放的时候出现一卡一卡的现象。
*/
private static final int CACHE_BUFF = 10 * 1024;
/**
<