学更好的别人,

做更好的自己。


本文长度为4185,预计阅读9分钟



Android播放网络视频

随着生活节奏的增加,短视频已经开始慢慢替代公众号软文的情况了,就像我自己发的文章也会经常放一些自己剪辑的效果视频,所以这一篇我们就主要学习一下Andriod的App中怎么进行视频的播放。

使用框架

1.  

JiaoZiVideoPlayer(视频播放器框架)

2.  HttpProxyCacheServer(音视频缓存播放框架)

3.  Glide(图片加载库框架)

简单说明

这个Demo我们用到了三个框架,其实最开始的时候我只是想试试JiaoZiVideoPlayer这个视频播放框架,当然使用过程中也遇到了不少的坑,后来因为服务器上的视频播放太卡了,除了学习到了IIS里面还要配置关于h264的相关模块,也找到了HttpProxyCacheServer这个视频缓存的框架,最后的Glide是一个加载缩略图的框架,用起来非常简单。

实现效果

上面的视频中可以看出来,第一个视频是我先播放过了,所以缓存到本地,再播放非常流畅,第二个视频加载起来就比较慢,播放一段后还卡顿一会,但是重新播放后,前面播放过的就非常流畅了,这就是我们的缓存框架起到了作用。

代码演示



android 解析mp4文件并播放 安卓手机视频解析_css

微卡智享

我们新建一个项目JiaoZiVideoDemo,在build.gradle加入我们上面说的三个框架

api "cn.jzvd:jiaozivideoplayer:7.0.5"
    implementation 'com.github.bumptech.glide:glide:4.10.0'
    implementation 'com.danikula:videocache:2.7.0'

android 解析mp4文件并播放 安卓手机视频解析_android 解析mp4文件并播放_02

划重点

1.JiaoZiVideoPlayer中最小的ApiLevel是16,一开始创建的时候我用的14,编译的时候就报错了,所以这里要改一下

android 解析mp4文件并播放 安卓手机视频解析_css_03

2.AndroidManifest.xml中要加入网络请求权限,如果是Android 9的机器也必须加上networkSecurityConfig的设置

android 解析mp4文件并播放 安卓手机视频解析_android_04

我自己的设备就是Android9.0,所以在测试过程中一开始一直就是加载视频失败,后来对了源码一点点的试,才找到是这个参数的原因,就是搜索一下这个的说明

网络安全性配置特性让应用可以在一个安全的声明性配置文件中自定义其网络安全设置,而无需修改应用代码。可以针对特定域和特定应用配置这些设置。此特性的主要功能如下所示:

  • 自定义信任锚:针对应用的安全连接自定义哪些证书颁发机构 (CA) 值得信任。例如,信任特定的自签署证书或限制应用信任的公共 CA 集。
  • 仅调试重写:在应用中以安全方式调试安全连接,而不会增加已安装用户的风险。
  • 明文通信选择退出:防止应用意外使用明文通信。
  • 证书固定:将应用的安全连接限制为特定的证书。

android 解析mp4文件并播放 安卓手机视频解析_android 解析mp4文件并播放_05

布局文件

我们的activity_main.xml文件中改为LinearLayout垂直布局,然后加入两个<cn.jzvd.JzvdStd>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <cn.jzvd.JzvdStd
        android:id="@+id/videoplayer"
        android:layout_width="match_parent"
        android:layout_height="200dp" />

    <cn.jzvd.JzvdStd
        android:layout_marginTop="20dp"
        android:id="@+id/videoplayer2"
        android:layout_width="match_parent"
        android:layout_height="200dp" />

</LinearLayout>

MainActivity.kt中的框架说明

HttpProxyCacheServer:

  1. 创建一个HttpProxyCacheServer的实例
  2. 再通过getProxyUrl方法把网络视频的地址存放到实例中生成新的url
proxyCacheServer = HttpProxyCacheServer(this)
var url = proxyCacheServer.getProxyUrl(videos[0])

JiaoZiVideoPlayer:

通过SetUp(url:String,title:String)的方法直接加载视频

myJzvdStd.setUp(
            url, "商盘通"
        )

Glide:

通过一行渐进式的代码可以搞定的加载图片

Glide.with(this)
  .load(pictures[0])
  .into(myJzvdStd.thumbImageView)

整个MainActivity的代码如下:

package dem.vac.jiaozivideodemo

import android.content.Context
import android.media.MediaRecorder
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import cn.jzvd.JZDataSource
import cn.jzvd.Jzvd
import cn.jzvd.JzvdStd
import com.bumptech.glide.Glide
import com.danikula.videocache.HttpProxyCacheServer


class MainActivity : AppCompatActivity() {

    private lateinit var myJzvdStd: JzvdStd
    private lateinit var myJzvdStd2: JzvdStd

    private lateinit var proxyCacheServer: HttpProxyCacheServer

    private val videos= arrayOf(
        "http://www.sumsoft.cn/vedio/prnbluetooth.mp4",
        "http://www.sumsoft.cn/vedio/SMPRM.mp4"
    )

    private val pictures=arrayOf(
        "http://www.sumsoft.cn/uploads/allimg/191012/1-191012141244.png",
        "http://www.sumsoft.cn/uploads/191210/1-1912101G154606.png"
    )


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        proxyCacheServer = HttpProxyCacheServer(this)

        //Android 9加载网络视频一直失败没找到原因,后来对比源码发现
        //在Androidmanifest.xml中android:networkSecurityConfig="@xml/jz_network_security_config"
        //很重要,否则一直加载不成功
        myJzvdStd = findViewById(R.id.videoplayer)
        var url = proxyCacheServer.getProxyUrl(videos[0])
        myJzvdStd.setUp(
            url, "商盘通"
        )
        Glide.with(this)
            .load(pictures[0])
            .into(myJzvdStd.thumbImageView)


        myJzvdStd2 = findViewById(R.id.videoplayer2)
        url = proxyCacheServer.getProxyUrl(videos[1])
        myJzvdStd2.setUp(url, "商盟质量追溯系统")
        Glide.with(this)
            .load(pictures[1])
            .into(myJzvdStd2.thumbImageView)
    }

    override fun onPause() {
        super.onPause()
        Jzvd.releaseAllVideos()
    }

    override fun onBackPressed() {
        if (Jzvd.backPress()) {
            return
        }
        super.onBackPressed()

    }
}

这样我们JiaoZiVideoPlayer配合HttpProxyCacheServer及Glide的简单使用就完成了。