DASH流媒体MPD文件存储
Android中常见的持久化数据存储方法有三个:文件存储、SharedPreferences存储和数据库存储。文件存储的核心思想是将数据按照streaming的形式保存到本地,这点与C++有共通点。写一个利用文件存储数据的简单实例,重新定义《MPD解析模块在Android中的实现》中提到的parseXMLWithPull(String xmlData)方法,在showResponse()后接着调用Save()方法,将解析数据保存到本地:
private void parseXMLWithPull(String xmlData) { //MPD解析方法Represent repres = new Represent();//实例化一个Representation对象String line = "";try {XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); //获得一个XMLPULL工厂类的实例XmlPullParser xmlPullParser = factory.newPullParser(); //获得一个XML解析器的实例xmlPullParser.setInput(new StringReader(xmlData));int eventType = xmlPullParser.getEventType();while (eventType != XmlPullParser.END_DOCUMENT) {String nodeName = xmlPullParser.getName();switch (eventType) {// 通过判断事件类型来选择执行不同的代码// 开始解析某个结点case XmlPullParser.START_TAG: {if ("Representation".equals(nodeName)) {//由<Representation开始解析repres.setId(xmlPullParser.getAttributeValue(null, "id"));repres.setWidth(xmlPullParser.getAttributeValue(null, "width"));repres.setHeight(xmlPullParser.getAttributeValue(null, "height"));}break;}// 完成解析某个结点case XmlPullParser.END_TAG: {if ("Representation".equals(nodeName)) { //由Representation--/>结束解析Log.d("Representation", "id is " + repres.getId());//在调试窗口logcat打印出属性值Log.d("Representation", "width is " + repres.getWidth());Log.d("Representation", "height is " + repres.getHeight());line = line +"ID: "+ repres.getId()+"; WIDTH: "+repres.getWidth()+"; HEIGHT: "+repres.getHeight()+";\n";//将已经遍历的属性值连接成一个字符串,并注意换行}break;}default:break;}eventType = xmlPullParser.next();}showResponse(line);//将字符串对象传入showResponse()方法,打印在UI的TextViewSave(line);//保存数据到本地文件} catch (Exception e) {e.printStackTrace();}}
利用文件存储方式保存数据,Save()方法可以定义为:
public void Save(String streaming){FileOutputStream out = null;BufferedWriter writer = null;try {out = openFileOutput("mpd", Context.MODE_APPEND);
//文件名定义为mpd,因为会多次调用Save()方法,不希望每次覆盖之前内容,因此声明为MODE_APPENDwriter = new BufferedWriter(new OutputStreamWriter(out));writer.write(streaming);}catch (IOException e){e.printStackTrace();}finally {try{if(writer != null){writer.close();}}catch (IOException e){e.printStackTrace();}}}
Run App之后点击MainActivity页面的send request按钮,执行:
在Device File Explore视窗中Data/Data/应用包名/files/下面找到新创建的mpd文件:
打开mpd文件,查看存储的解析数据:
在真机上运行App,但是通过手机的管理文件夹不能搜索到mpd文件,网上的解答是,应用的数据文件不能被用户直接看到,只有将手机ROOT后才可以看到Data文件。
文件存储只适用于保存一些简单的数据和键值对,当需要存储大量复杂的关系型数据时,便会用到数据库。使用SQLite数据库对上面的实例进行重写。首先建立一个MPDdatabaseHelper类,继承自SQLiteOpenHelper类,重写父类的构造方法、onCreate()方法和onUpgrade()方法,并定义表单的创建语句构成的数据成员字符串。
package com.example.xmlparser;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;/*** @Author Fupenzi on 2019/1/4.* @Blog https://blog.csdn.net/qq_34041083*/public class MPDdatabaseHelper extends SQLiteOpenHelper {public static final String CREATE_DATABASE = "create table MPD("+"id string primary key,"+"width string,"+"height string)";private Context context;public MPDdatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){super(context, name, factory, version);}@Overridepublic void onCreate(SQLiteDatabase database){database.execSQL(CREATE_DATABASE);}@Overridepublic void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion){}
}
在public class MainActivity extends AppCompatActivity implements View.OnClickListener 类中声明类MPDdatabaseHelper对象成员:
private MPDdatabaseHelper mpdHelper;
并在MainActivity活动的onCreate()方法中对mpdHelper对象进行实例化
mpdHelper = new MPDdatabaseHelper(this, "MPD.database",null,1);
在private void parseXMLWithPull() 方法中创建数据库并声明数据填充对象
SQLiteDatabase database = mpdHelper.getWritableDatabase();
//getWritableDatabase()方法检测并创建数据库,返回一个数据库对象ContentValues values = new ContentValues();//数据库内容填充对象
在case XmlPullParser.END_TAG:……解析结果后面,对将解析结果写入到数据库内容对象中,并将写好的内容insert到表单中,之后清空内容对象。
values.put("id",repres.getId());values.put("width",repres.getWidth());values.put("height",repres.getHeight());database.insert("MPD",null,values);values.clear();
Run App,通过文件夹视窗可以看到创建的表单:
再通过Terminal进入到该目录利用命令行窗口查看MPD.database中的内容
可以看到表单内容和之前本地文件存储的内容一样,说明MPD解析的内容成功保存到数据库中。
DASH流媒体MPD文件存储相关推荐
- DASH流媒体MPD文件解析
MPD文件本质是XML文件,其说明了DASH服务端流媒体视频切片的相关信息,包含分辨率,大小,帧率等等,因此在DASH客户端实现的第一步便是解析服务端的MPD文件,其常见结构如图所示: MPD文件来源 ...
- DASH流mpd文件注释---比较详细
<!--profiles:不同的profile对应不同的MPD要求和Segment格式要求 mediaPresentationDuration:整个节目的时长 minBufferTime:至少需 ...
- DASH 流媒体协议(Dynamic Adaptive Streaming over HTTP)概述——起源、MPD文件解析、相关项目
流媒体 注: 1.此篇文章立足于巨人的肩膀之上,侵必删 2.有许多内容尚未完成,包括segment的类别,HTTP协议基础等 DASH DASH的起源-- MPEG(Moving Picture Ex ...
- MPEG DASH MPD文件字段解释
转自:http://www.cnblogs.com/vleung/p/4162409.html MPEG DASH作为三大流媒体协议之一,诞生的目的是为了统一标准,因此是兼容SmoothStreami ...
- DASH MPD 文件内容解析
拿个MPD内容举个例子: <?xml version="1.0" encoding="utf-8"?> <!-- Created with B ...
- 文件标识符无效。使用 fopen 生成有效的文件标识符。_「存储架构」块存储、文件存储和对象存储(第1节)...
全球传输和生成的数据比以往任何时候都多.国际数据公司(IDC)的分析师预计,到2025年,全球数据层将增至163zb.这比2016年16.1 ZB的数据增长了1000%以上.数据大量增加的原因是多方面 ...
- SDS趋势之二:对象存储将替代文件存储
首先什么是对象存储? 对象存储(Object Storage)是综合了NAS和SAN的优点,同时具有SAN的高速直接访问和NAS的数据共享等优势,提供了高可靠性.跨平台性以及安全的数据共享的存储体系结 ...
- 中维云视通录像文件存储及设置_视频监控存储方式选择,磁盘阵列与NVR优势对比...
如何构建一个高效.经济.安全的存储架构对于安防监控的建设是至关重要的,目前视频监控存储无非DVR存储.DVS前端存储.NVR存储及磁盘阵列集中存储. 随着视频监控高清化.网络化,使得NVR存储和磁盘阵 ...
- 块存储、文件存储、对象存储这三者的区别
参考链接 https://blog.csdn.net/wuxiaobingandbob/article/details/80178502 https://blog.csdn.net/qq_319331 ...
最新文章
- 一个用户实体应该有它自己的实体验证,即一个实体应该有它的属性,方法,扩展属性及验证机制组成...
- JVM年轻代,老年代,永久代详解
- 3G,三足鼎立;花开千朵,各表一枝!!!
- python elasticsearch 入门教程(一)
- Dubbo原理和源码解析之服务引用
- 在Unity内使用对象池并实现线程安全的单例模式
- java设计模式6.代理模式
- css如何将元素水平居中
- 买断变订阅!苹果第一付费软件被骂上热搜 官方回应
- mariadb数据库基础
- JAVA标识符和命名规则
- 机器学习大牛李飞飞的电脑配置
- JSP——在JSP中嵌入java代码
- PHP计算比较两段文字内容的重复率
- 宋朝人物第一,朱熹都说他是“天地间第一流人物”
- 计算机前沿技术讲座心得体会
- NIOS II --- UART
- 删除服务器的文件夹,删除服务器上的文件夹
- 基于libusb库、uac协议,获取Audio声音数据
- ConcurrentHashMap源码分析,轻取面试Offer(二)