山东大学项目实训十五——开源万能解码框架解决

开源万能解码框架解决

1.ffmpeg

多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。
国内很多手机客户端都是集成这个开源框架
http://www.oschina.net/p/ffmpeg/
没有Android版本

2.VLC

VLC多媒体播放器(最初命名为VideoLAN客户端)是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影音光盘及各类流式协议。它也能作为unicast或 multicast的流式服务器在IPv4或 IPv6的高速网络连接下使用。它融合了FFmpeg计划的解码器与libdvdcss程序库使其有播放多媒体文件及加密DVD影碟的功能。

官网:http://www.videolan.org/

有Android版本
http://www.videolan.org/vlc/download-android.html

3.Vitamio 万能解码框架,在Android和IOS平台上直接使用。

Vitamio 能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频,还可以在 Android 与 iOS 上跨平台支持 MMS, RTSP, RTMP, HLS(m3u8) 等常见的多种视频流媒体协议,包括点播与直播。

里面封装了ffmpeg

集成Vitamio项目中来

1.把案例运行起来

2.关联vitamio库

3.当系统播放器播放出错的时候,跳转到VitamioVideoPlayer万能播放器中播放

4.重新activity_vitamio_video_player.xml,里面VideoView改成Vitamio的VideoView,并且自定义VitamioVideoView

5.初始化万能解码框架
Vitamio.isInitialized(getApplicationContext());

6.到Vitamio的包

7.把Vitamio用到的权限拷贝到功能清单文件

   <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

8.把Vitamio需要配置的Activity拷贝到当前工程的功能清单文件

   <!-- Don't forgot InitActivity -->
        <activity
            android:name="io.vov.vitamio.activity.InitActivity"
            android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
            android:launchMode="singleTop"
            android:theme="@android:style/Theme.NoTitleBar"
            android:windowSoftInputMode="stateAlwaysHidden" />

软件解码
硬件解码,通常是在CPU芯片集成- 系统的API

Android 开发者文档指南https://developer.android.google.cn/guide/topics/media-apps/media-apps-overview?hl=zh-cn
安卓前后端连接教程

  1. 首先需要安装postman软件,用于测试后端接口

  2. 用IEDA打开后端的工程并运行,观察controller文件夹下的文件,controller这一层是接受前端请求的。这里按照一个数据表一个文件进行分类。

  3. 后端接口的类别主要有3种,根据接口函数的参数前方@的不同分别@RequestBody、@RequestParam和上传文件型。如下图所示

  4. 先学会这3种不同的类型在postman中如何测试连接通信,然后再从普遍性到特殊性,在AS里面进行前后端通信。
    共同的地方:不管是哪种类型的,都是用POST方法发送,并且在地址栏里填写接口的地址方式都是一样的,有2级路径,如下图所示

不同之处:
类别1——Body型:以Comment中的add接口为例子

先去resources目录下的mapper目录下打开对应的Mapper.xml文件夹,这里面写的是操作数据库时的SQL语句。可以看到这里有个id为add的语句块,这是add接口收到请求后会执行的SQL语句。

在postman中,先选择Body,然后点击raw,再将格式切换为JSON,在编辑区写出JSON格式的文本,JSON文本中的键名就是SQL语句中#{}里面的变量名,键值就是你要传进去的变量值,这里一定要打开数据库看清楚对应字段的类型。如下图所示:

确认无误后点击SEND按钮,会发现IDEA运行日志中出现刚刚进行的SQL操作的结果,刷新数据库会发现该记录被添加到数据库中了,这样就成功了!(因为这是insert操作,接口函数的返回类型是void,所以postman这边不会有结果显示)

类型2——Param类型:以comment中的listByUid接口为例

这种类型非常简单,只需要看controller层就行了!在postman中先点击Params,然后在下面添加KEY,这里的KEY就是接口函数的参数,在VALUE里填入你需要传入的值。

确认无误后点击send按钮,可以看到IDEA运行日志里出现了SQL查询结果,postmna这边的结果区也显示出了JSON格式的结果,这样就成功了!(注意,这里返回的是JSON数组,后面在AS里前端获取返回值时对数组or单个元素的操作是不同的)

类型3——上传文件型:以comment的upload_img接口为例子
这种类型的接口需要看controller层和service层,请同时打开service文件夹下的impl文件夹下的对应的Service文件!下图所示是service层中找到的对应操作的函数,可见文件会被上传到后端工程文件夹下的upload文件夹下的comment_img文件夹下

打开postman,选择POST方法,地址栏输入对应的接口的路径,然后选择Body,选择form-data,在KEY这边先选择类型为File。

之后再在KEY里填入file,VALUE里选择一个你要上传的文件

确认无误后,点击send按钮,可以看到postman里收到返回的信息,code200,并且body这边有上传后的文件在服务器上的文件名,这样就成功了!

我们可以去comment_img文件夹下看看有没有刚刚上传的文件,果然是有的,hhh

  1. 在android studio里写发送post请求的代码。postman的普遍性规律测试通过后,AS里使用后端接口的道理是一样的,postman里怎么发送post请求,AS也跟着学就行了!
    三种类型的共同点:以下是代码模板

上图例子是按钮按下后发送一个POST请求,首先要创建一个Thread,网络请求操作较慢,所以要在子线程里操作,在主线程里发送网络请求会造成堵塞,APP可能会崩溃的。其次是网络请求的操作要放在try语句里,毕竟网络通信不一定成功的。最后需要注意的是子线程不能直接更新UI,要在子线程里操作UI,需要借助runOnUiThread
不同点:
类型1——Body型:以Comment中的add接口为例子
我们知道它在postman中是这样发送post请求的

转换为AS发送请求的代码如下所示,红框中是类型1——body型发送的请求的方式。(因为这个后端接口没有返回值,所有不需要考虑获取后端的返回值)

运行一下APP点击对应的按钮发送POST试试,看到IDEA和数据库这边都有反应,成功啦!

类型2——Param型:以comment中的listByUid接口为例
在postman中是这样发送post请求给这个接口的

那么在AS中,代码如下图所示,如下图所示进行发送:

运行APP,点击对应的按钮试试,发现AS的日志里成功打印出从后端获取过来的值,成功!

类型3——上传文件型:以comment的upload_img接口为例子
在postman中是这样发送请求的

切换到AS,如下图代码所示将文件上传到后端接口上

运行APP点击相应的按钮确认一下,看看日志,文件夹里都有了,说明成功!

文件上传注意事项:

  1. 大文件上传比较慢,前端应该想办法控制一下,在文件上传成功前不要让用户觉得好像没在上传,于是狂点上传按钮导致上传了好几份文件,上传的过程以及上传成功后最好加一些UI上的提示。
  2. 上传文件的接口只是上传文件而已,数据库里保存文件路径的字段还需要调用其他相应的接口去修改哦!
  3. 小心安卓权限问题,这里打开需要上传的文件时是需要存储空间权限的!

还有这个路径只是个例子,在vlog++项目中需要用下图所示的Environment.getExternalStorageDirectory()来获取文件所在的路径

其他注意事项:

  1. 后端接口返回值都是JSON格式的,有的是JSON数组,有的是单个JSON元素。前端在接收后端返回过来的JSON文本后将其转换为JSON时需要小心这一点。
    字符串转JSON数组后再遍历取值的方法:

字符串直接转为JSON对象进行取值的方法

  1. 有时候有些操作需要调用多个接口,因为1个接口不够满足需求。
    情况1:先调用接口A,接口A操作成功后才能调用接口B,有严格的先后关系
    不需要创建2个子线程,在一个子线程里可以先后发送POST请求

情况2:接口A和接口B可以同时操作,没有先后关系
如下图所示,创建两个并列的线程,即可同时发送多个POST给不同的后端接口


版权声明:本文为fangjiayou原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。