安卓--视频模块需求-M3U8格式视频解析

Posted 彬彬杨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓--视频模块需求-M3U8格式视频解析相关的知识,希望对你有一定的参考价值。

 最近做需求,视频看房,上传的视频,通过发送到亚马逊服务器,分片上传,上传成功后,在房屋详情页得到的url是一个M3U8格式的url,这个时候是需要自己去解析M3U8,然后获取到视频列表,以及视频清晰度内容的。

下面来介绍下M3U8

https://www.jianshu.com/p/e97f6555a070

这个网址的内容能解释 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
    }
}

以上是关于安卓--视频模块需求-M3U8格式视频解析的主要内容,如果未能解决你的问题,请参考以下文章

安卓手机怎么看m3u8类型视频

现在网上的视频很多都是m3u8格式的,它们用这种格式有啥好处?

安卓手机播放M3U8视频文件的方法

如何解析youku的m3u8文件,拿到mp4文件?

海康视频回放,rtsp视频接口转换成.m3u8格式文件

海康视频回放,rtsp视频接口转换成.m3u8格式文件