Android---视频模块需求-android M3U8格式视频解析
Posted 怀化纱厂球迷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android---视频模块需求-android M3U8格式视频解析相关的知识,希望对你有一定的参考价值。
最近做需求,视频看房,上传的视频,通过发送到亚马逊服务器,分片上传,上传成功后,在房屋详情页得到的url是一个M3U8格式的url,这个时候是需要自己去解析M3U8,然后获取到视频列表,以及视频清晰度内容的。
下面来介绍下M3U8
这个网址的内容能解释 M3U8
这是后台返回的URL(含有M3U8后缀的url),可以看到有 720 480 360 格式
这是根据对应的M3U8打开后的文件内容
最后效果图
直接上代码:
class MainActivity : AppCompatActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
ParserThread().execute()
private inner class ParserThread : AsyncTask<Void, Void, Map<String, Int>>()
internal lateinit var url: URL
override fun doInBackground(vararg voids: Void): Map<String, Int>?
try
this.url = URL("https://video.591.com.tw/debug/target/house/hls/2021-07-14/130/master.m3u8")
val urlConnection = this.url.openConnection() as HttpURLConnection
urlConnection.connectTimeout = 60000
urlConnection.readTimeout = 30000
urlConnection.requestMethod = "GET"
urlConnection.connect()
return parseHLSMetadata(urlConnection.inputStream, this.url)
catch (e: IOException)
e.printStackTrace()
return null
override fun onPostExecute(aVoid: Map<String, Int>?)
super.onPostExecute(aVoid)
if (aVoid == null) return
Log.d("Khaleel", "aVoid : " + aVoid)
/**
*
*这里通过正则来进行的解析匹配规则
**/
private fun parseHLSMetadata(i: InputStream, url: URL): HashMap<String, Int>?
try
val r = BufferedReader(InputStreamReader(i, "UTF-8"))
val segmentsMap: HashMap<String, Int>? = null
val pattern = Pattern.compile("^#EXT-X-STREAM-INF:.*BANDWIDTH=(\\\\d+).*RESOLUTION=([\\\\dx]+).*")
do
val line: String? = r.readLine() ?: break
Log.d("M3U8Parser", "BufferedReader : " + line)
val match = pattern.matcher(line)
if (match.matches())
Log.d("M3U8Parser", "Output 1: " + match.group())
Log.d("M3U8Parser", "Output 2: " + match.group(1))
Log.d("M3U8Parser", "Output 3: " + match.group(2).split("x".toRegex()).dropLastWhile( it.isEmpty() ).toTypedArray()[0])
val renditionUrl = r.readLine()
Log.d("M3U8Parser", "Output 4: " + renditionUrl)
Log.d("M3U8Parser", "Output 5: " + url.host + "--" + url.protocol)
var rendition: URL
rendition = try
URL(renditionUrl)
catch (e: MalformedURLException)
URL(url.protocol + "://" + url.host + "/" + renditionUrl)
Log.d("M3U8Parser", "Output 6:" + rendition.toString())
while (line != null)
r.close()
return segmentsMap
catch (e: IOException)
e.printStackTrace()
return null
以上是关于Android---视频模块需求-android M3U8格式视频解析的主要内容,如果未能解决你的问题,请参考以下文章