因最近项目需要,研究了一个礼拜的m3u8。格式为m3u8的视频,其实是由多个.ts文件组成在一起播放的。下面有些资料是参考了网上的,总体概括下实现思路:

1.根据后台给出的m3u8的地址,实现播放,核心代码贴出:

try {String url = "http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8";//测试的m3u8地址//String url="http://devimages.apple.com/iphone/samples/bipbop/gear1/fileSequence0.ts";MediaPlayer mPlayer = new MediaPlayer();mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mPlayer.setDataSource(url);mPlayer.prepare(); // might take long! (for buffering, etc)mPlayer.setDisplay(surfaceHolder);    //设置显示视频显示在SurfaceView上  自己写个SurfaceHolder设置进去,不懂的可以上网查下这个如何设置} catch (IOException e) {e.printStackTrace();}

2.下载m3u8的视频。用浏览器打开m3u8的地址,会发现它是个下载地址,默认会把m3u8文件下载下来,右键以文本方式打开m3u8,会发现是一串有规律的文本文件:

  #EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=200000
gear1/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=311111
gear2/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=484444
gear3/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=737777
gear4/prog_index.m3u8

m3u8的地址你都不能直接得到,我们用得到这个文件的链接地址的前半段http://devimages.apple.com/iphone/samples/bipbop/拼接上二级文件的相对地址gear1/prog_index.m3u8得到一个地址http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8。
把此地址放到浏览器中,我们又会得到一个同样名为prog_index.m3u8的文件,内容如下:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10, no desc
fileSequence0.ts
#EXTINF:10, no desc
fileSequence1.ts
#EXTINF:10, no desc
fileSequence2.ts
#EXTINF:10, no desc
fileSequence3.ts
#EXTINF:10, no desc
fileSequence4.ts
#EXTINF:10, no desc
//省略后半部分

终于可以看到ts文件名了,我们还是没有得到真正的视频地址,老办法拼接后我们得到这么一段链http://devimages.apple.com/iphone/samples/bipbop/gear1/fileSequence179.ts,这就是真正的视频地址。
通过网络下载把所有的ts文件都下载下来,我写了个方法,在此贴出

package com.example.pc.videoplaydemo;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;/*** 给类提供访问网络的方法* @author Administrator**/
public final class HttpConnect {/*import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;*//*** 利用HttpClient获取指定的Url对应的HttpResponse对象* @param url* @return*/public static HttpResponse getResponseFromUrl(String url){try {HttpClient client = new DefaultHttpClient();HttpGet get = new HttpGet(url);HttpResponse response = client.execute(get);if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){return response;}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}return null;}/*** 利用HttpClient获取指定Url对应的字符串对象* @param url* @return*/public static String getStringFromUrl(String url){try {StringBuilder result = new StringBuilder();HttpResponse res = HttpConnect.getResponseFromUrl(url);if(res != null){InputStream is = res.getEntity().getContent();BufferedReader reader = new BufferedReader(new InputStreamReader(is));String line = "";while((line = reader.readLine()) != null){result.append(line);}is.close();return result.toString();}} catch (Exception e) {// TODO: handle exception}return null;}
}
 /*** 解析m3u8,下载m3u8文件 * @param url 传入m3u8的地址*/public static void checkURlBTS(String url) {List<String> m3u8List = null;//m3u8地址集合List<String> tsList = null;//ts文件地址集合额HttpResponse res = HttpConnect.getResponseFromUrl(url);//HttpResponse res = HttpConnect.getResponseFromUrl(url);try {if (res != null) {m3u8List = new ArrayList<>();tsList=new ArrayList<>();InputStream in = res.getEntity().getContent();BufferedReader reader = new BufferedReader(new InputStreamReader(in));String line = "";while ((line = reader.readLine()) != null) {if (line.startsWith("#")) {} else if (line.length() > 0 && line.endsWith(".m3u8")) {String mUpM3u8URL=url.substring(0,url.lastIndexOf("/")+1);m3u8List.add(mUpM3u8URL+line);} else if (line.length() > 0 && line.endsWith(".ts")) {//判断该文件是否含有.ts文件String mUpTSURL=url.substring(0,url.lastIndexOf("/")+1);tsList.add(mUpTSURL+line);}}in.close();}} catch (Exception e) {e.printStackTrace();}if(m3u8List!=null&&m3u8List.size()!=0){for (int i=0;i<m3u8List.size();i++){checkURlBTS(m3u8List.get(i));//使用递归方式}}else if(tsList.size()!=0){//下载.ts文件 addLoad(tsList);   }}/***添加下载的ts文件*/public static void addLoad(final List<String> urlList){//for (int i=0;i<urlList.size();i++){for (int i=0;i<5;i++){Log.e("get(i)-->",""+urlList.get(i));load(urlList.get(i));}}/*** @Desciption: 读取任意文件,并将文件保存到手机SDCard*/public static void load(String loadURL) {String path = loadURL.substring(loadURL.substring(0, loadURL.lastIndexOf("/")).lastIndexOf("/") + 1, loadURL.lastIndexOf("/"));String fileName = loadURL.substring(loadURL.lastIndexOf("/") + 1, loadURL.length());OutputStream output = null;try {//因ts文件非常之多,下载很缓慢,我们项目是使用了okHttp下载的,但为了方便大家,写了个httpclient下载URL url = new URL(loadURL);HttpURLConnection conn = (HttpURLConnection) url.openConnection();//取得inputStream,并将流中的信息写入SDCardString SDCard = Environment.getExternalStorageDirectory() + "";String pathName = SDCard + "/" + path + "/" + fileName;//文件存储路径File file = new File(pathName);InputStream input = conn.getInputStream();if (file.exists()) {return;} else {String dir = SDCard + "/" + path;new File(dir).mkdir();//新建文件夹file.createNewFile();//新建文件output = new FileOutputStream(file);//读取大文件byte[] buffer = new byte[4 * 1024];while (input.read(buffer) != -1) {output.write(buffer);}output.flush();Log.e("success-->","come in");}} catch (Exception e) {e.printStackTrace();} finally {try {if (output!=null){output.close();}} catch (IOException e) {e.printStackTrace();}}}

这样就可以下载m3u8了。

3.播放缓存的m3u8。这个就不贴代码了,播放时,就把本地的m3u8地址替换网络的播放地址就可以了。

这有篇挺好的文章,http://www.cnblogs.com/Leo_wl/p/5646916.html

我的心愿是世界和平。。。

Android,播放m3u8视频和下载m3u8的视频相关推荐

  1. 美拍视频怎么下载?美拍视频解析下载和保存工具

    本文转载: 美拍视频怎么下载?美拍视频解析下载和保存工具 怎么下载美拍视频保存到手机本地?解析美拍视频下载和保存工具可以在线实现美拍视频链接转换并保存美拍视频到本地. 美拍视频怎么下载?手机怎么保存美 ...

  2. 【Android】利用WindowsManager悬浮窗播放本地视频以及下载线上视频保存在本地

    基于目前又重新拾起了分屏的项目需求,对之前研究的分屏播放视频做了更深入的研究.在之前的基础上做了改进和用户优化上的处理,实现了原生的VideoView加载本地视频.并使用FileDownLoader下 ...

  3. 微信视频号视频可以下载吗?视频下载器安装使用教程

    简介 最近小伙伴推荐了一款视频下载神器,它可以批量下载微信视频号中的视频到本地上,我试了一下非常简单方便,而且还支持预览等操作,今天分享给大家 软件下载 ➤ 微信视频号下载器下载 ⇲ 安装使用教程 安 ...

  4. python 2到100的素数_po视频app下载安装|西瓜视频app下载安装_电脑知识学习网

    陈MM最近迷上某电视剧,任何相关视频都不放过.睡前用好看视频看了几个后,惊喜地发现好看读懂了她的喜好,开始推荐和该剧有关的所有视频-并且还能自动连播!看着看着,天就亮了...人生难得知己,看好看视频, ...

  5. python下载m3u8地址_python 下载m3u8视频的示例代码

    import requests import os import datetime import threading class xiazai(): def __init__(self,url): s ...

  6. android播放网页视频播放器下载,android:自己实现能播放网络视频url的播放器

    android原生自带的播放器一般只能播放本地视频,而没有播放url的功能.不过android系统中有一个VideoView的控件可以实现这一功能. 简单实现如下: public class MyVi ...

  7. android播放器 慢速,能慢放视频的手机软件 安卓手机视频慢放,把视频速度调整为1/2X...

    视频慢放,就是把视频的播放速度调慢.这种效果经常能见到,应该不会陌生.以往调整视频播放速度的操作都是在电脑上完成的,但是给大家安利一个能在手机上面就调整视频播放速度的方法,并且是安卓手机哦.用安卓手机 ...

  8. java上传视频代码下载_java 实现视频上传

    [实例简介] java上传视频转码播放的一个demo,实现java上传视频.转码.截图和播放功能 [实例截图] [核心代码] java视频上传,转码,播放实现 └── java视频上传,转码,播放实现 ...

  9. 最新花椒回放下载方法-马赛克视频助手

    花椒直播是现在比较热门的一款视频直播软件,在花椒直播里不仅能轻松的看直播视频,还可以看回放哦.那么怎么下载花椒直播的回放视频呢?怎么把花椒主播的回放视频保留在本地呢?接下来小编给大家介绍花椒直播回放的 ...

最新文章

  1. 什么是导师负责制_为什么一个导师是不够的
  2. python怎么安装numpy库-python怎么安装numpy库
  3. wps中的相交_【研途技能贴】| WPS里的布尔运算
  4. 搜狗皮肤php怎么转换,如何给搜狗输入法更换皮肤和输入方式
  5. 为什么要用dubbo,dubbo和zookeeper关系
  6. 《技术的潜能:商业颠覆、创新与执行》一一2.12决心、愿望和耐力
  7. python日志模块 限制日志记录数_python日志记录-logging模块
  8. 移动端API接口优化的术和结果
  9. 项目管理可参考华为这10张表格
  10. 软件测试黑马程序员课后答案_(完整版)软件测试技术基础课后习题答案
  11. 杨辉三角计算机中的应用,杨辉三角
  12. 在面试中脱颖而出的流程全解
  13. 音乐格式如何进行转换,音频格式转换器哪个好
  14. telegram 新增 删除 联系人
  15. python 打包命令以及使用方法
  16. Comsol软件入门基础教学
  17. PHP生成微信小程序带参数的二维码,可生成带参数二维码
  18. 无线mesh网络(多跳(multi-hop)网络)
  19. 金蝶软件安装时,提示安装包配置文件(Setup.Lst)文件不存在无法安装处理方法
  20. 【案例教程】无人机生态环境监测、图像处理与GIS数据分析综合实践

热门文章

  1. 两个整数相除,不使用乘法,除法和取余
  2. 解决dial tcp 172.217.160.81:443: connectex:
  3. 我要曝光一个阿里P7
  4. js实现简单点名/抽奖
  5. 人工智能图片素材高清,机器人图片卡通 素材
  6. iOS 状态栏点击事件
  7. 一笔画完C语言程序寻找路径算法
  8. 2020低压电工实操考试视频及低压电工模拟考试题库
  9. 下载 WIN10 系统镜像
  10. Leetcode69 x的平方根(简单篇)