安卓多媒体API——Vitamio框架

之前学习了MediaPlayer

https://blog.csdn.net/nishigesb123/article/details/89479084

但MediaPlayer支持的媒体格式其实是有限的,在开头也提到,安卓多媒体其实也涉及了很多第三方框架。

这篇文章就是关于安卓的多媒体播放的一个第三方框架——Vitamio框架,它几乎支持所有的媒体格式。


Vitamio框架

概述

官网地址:https://www.vitamio.org/

英文官网地址(?):https://www.vitamio.org/en/
项目地址:https://github.com/yixia/VitamioBundle

建从下面地址下载!!理由参考:https://blog.csdn.net/nishigesb123/article/details/89576962

新项目地址(?):https://github.com/yixia/VitamioBundleStudio


?是摘自官网的介绍

Vitamio 是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染。Vitamio 凭借其简洁易用的 API 接口赢得了全球众多开发者的青睐。到目前,全球已经有超过 一万 种应用在使用 Vitamio,覆盖用户超过 5亿 。

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

流媒体支持

Vitamio 支持各种常见的流媒体协议,可以点播或者直播音频和视频,例如如下常见协议均能无缝支持:

  • MMS
  • RTSP (RTP, SDP), RTMP
  • HTTP progressive streaming
  • HLS - HTTP live streaming (M3U8)

音频和视频格式

Vitamio 使用了 FFmpeg 做为媒体解析器和最主要的解码器,同时开发了针对不同移动平台的硬解码方案,能够完美支持 H.264/AVC、H.263、 MPEG4 等常见的视频编码,覆盖上百种多媒体格式。下表只是一些最常见的视频格式支持,除特殊标明,全部支持硬件加速:

  • DivX/Xvid
  • WMV (一般只有软解码)
  • FLV
  • TS/TP
  • RMVB (只有软解码)
  • MKV
  • MOV
  • M4V
  • AVI
  • MP4
  • 3GP

字幕支持

Vitamio 对字幕的支持很优秀,包括各种常见外挂字幕与很多视频格式的内嵌字幕,同多个字幕等特性的支持也非常完善。比如:

  • SubRip(.srt)
  • Sub Station Alpha(.ssa) / Advanced Sub Station Alpha(.ass)
  • SAMI(.smi/.sami)
  • MicroDVD(.sub/.txt)
  • SubViewer2.0(.sub)
  • MPL2(.mpl/.txt)
  • Matroska (.mkv) 内置字幕

更多特性

除了上面列出的常见功能之外,Vitamio 还做了相当多人性化的工作:

  • 多音轨与字幕支持
  • 细致的 CPU 与 GPU 优化
  • 支持手机到平板各种设备
  • 流媒体播放缓冲支持
  • 播放画面比例大小随手调节
  • 自动文字编码检测,拒绝乱码

还有更多新特性没有被列出,请参考开发文档。


引入 

?下面是官方的导入介绍

导入使用 

1、导入。下载回来后大家可能发现没有.project工程文件,可以通过File -> Import -> Android -> Existing Android Code Into Workspace来导入工程,然后改一下工程名称即可。

2、将VitamioBundle工程作为Android Library引入Demo工程使用即可。

注意:
     如果是Windows用户,请将VitamioBundle与Demo工程放在同一个文件夹下,否则添加Android Library可能失败,其他问题一般clean一下重新编译一下就好了。其他问题请参考错误大全。

在官网或Github下载完整Vitamio项目后

在自己的项目右键

New一个Module

选择Liberary

点击Next,进行配置

配置说明:看我们下载好的vitamio项目,观察src文件夹,可以得出包名其实是io.vov.vitamio的结论,所以?也填这个

完毕后将图示文件复制到我们的vitamio即可

切换到project视图,或者直接在项目目录操作

 

把下载的vitamio项目的libs文件夹里的四个子文件夹内容复制

 

把下载的vitamio项目的libs文件夹里的三个子文件夹内容选中,拷贝。 

 

在项目app/src/main目录创建jniLibs文件夹,并把?复制进来

一开始都不知道As原来只认这个目录 搞了好久

https://blog.csdn.net/nishigesb123/article/details/89576962

 

 

最后grade加一下这句话,这么不智能,这种竟然不是自动帮我补上的吗。。。

至此已经导入完毕

然后还是遇到了点什么错误,说raw里啥啥没有,后来索性把res文件夹里的东西也复制了一份到自己的项目


?下面就是敲代码咯

使用

准备工作

可以参考下载的源码项目的配置文件,需要以下权限。

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

需要的申明 

        <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"/>

播放音频案例

布局文件

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
    tools:context=".MainActivity">

    <Button
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@id/pause"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/play"
        android:onClick="play"
        android:text="播放"/>

    <Button
        app:layout_constraintStart_toEndOf="@id/play"
        app:layout_constraintEnd_toStartOf="@id/stop"
        app:layout_constraintBottom_toBottomOf="parent"
        android:id="@+id/pause"
        android:onClick="pause"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="暂停"/>

    <Button
        app:layout_constraintStart_toEndOf="@id/pause"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:id="@+id/stop"
        android:onClick="stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="停止"/>


</android.support.constraint.ConstraintLayout>

 

 

MainActivity

package com.example.a4_26vitamio;

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import java.io.File;
import java.io.IOException;

import io.vov.vitamio.MediaPlayer;
import io.vov.vitamio.LibsChecker;

public class MainActivity extends AppCompatActivity implements MediaPlayer.OnPreparedListener {

    //注意导包import io.vov.vitamio.MediaPlayer;别错了
    private MediaPlayer mediaPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //加载so类库(通常使用C、C++编写类库)
        if (!LibsChecker.checkVitamioLibs(this))
            return;
        setContentView(R.layout.activity_main);
        //初始化播放器
        initMediaPlay();
    }

    private void initMediaPlay() {
        mediaPlayer = new MediaPlayer(this);

    }

    public void play(View v) {
        String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) + File.separator +"a1.mp3";
        try {
            mediaPlayer.reset();
            mediaPlayer.setDataSource(path);
            mediaPlayer.setOnPreparedListener(this);
            mediaPlayer.prepareAsync();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void pause(View v) {
        mediaPlayer.pause();
    }

    public void stop(View v) {
        mediaPlayer.stop();
        mediaPlayer.release();
    }

    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.start();
    }

}

效果的话是看不出啥效果了, 声音确实是有哒

控制台倒是输出了一堆日志,非常完整

点击暂停

点击停止

 

播放视频案例

新建一个Activity

之前学习了surfaceView可以播放视频,也了解到videoView也可以播放视频,但性能较差

在Vitamio框架重写了videoView,使得其不仅性能大幅提升,而且支持的格式也有了翻天覆地的变化。


首先是布局,按照?的描述,我们加入一个VideoView,注意是io.vov.vitamio.widget下的

样式已经

<?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=".Main2Activity">

    <io.vov.vitamio.widget.VideoView
        android:id="@+id/surface_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    
</LinearLayout>

?是代码部分

package com.example.a4_26vitamio;

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import java.io.File;

import io.vov.vitamio.LibsChecker;
import io.vov.vitamio.widget.MediaController;
import io.vov.vitamio.widget.VideoView;

public class Main2Activity extends AppCompatActivity {
    //注意导包别导错
    private VideoView vv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //加载so类库(通常使用C、C++编写类库)
        if (!LibsChecker.checkVitamioLibs(this))
            return;
        setContentView(R.layout.activity_main2);
        setContentView(R.layout.activity_main2);
        vv = findViewById(R.id.surface_view);
        MediaController mc = new MediaController(this);
        vv.setMediaController(mc);
        String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES) + File.separator + "test.mp4";
        //路径
        vv.setVideoPath(path);
        //获取焦点
        vv.requestFocus();
        vv.start();
    }
}

 

效果如?

框架已经设计好了UI部分才对,点击应该可以换出控制条,如果显示不出来,如左,可能是没有导入res的相关文件,实际效果如右图。

如果对UI的控制台不满意,可以手动去修改源码的布局文件。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云无心鸟知还

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值