视频播放器接口api,音乐播放器接口

http://www.itjxue.com  2023-01-22 06:57  来源:未知  点击次数: 

Android音视频【十二】使用OpenSLES和AudioTrack进行播放PCM

本节我们学习下如何播放pcm数据,在Android中有两种方法:一种是使用java层的 AudioTrack 方法,一种是使用底层的 OpenSLES 直接在 jni 层调用系统的 OpenSLES的c方法 实现。

两种使用场景不一样:

AudioTrack 一般用于 比如本地播放一个pcm文件/流,又或者播放解码后的音频的pcm流,API较简单。

OpenSLES 一般用于一些播放器中开发中,比如音频/视频播放器,声音/音频的播放采用的OpenSLES,一是播放器一般是c/c++实现,便于直接在c层调用OpenSLES的API,二也是如果用AudioTrack进行播放,务必会带来java和jni层的反射调用的开销,API较复杂。

可以根据业务自行决定来进行选择。

AudioTrack的方式使用较简单,直接在java层。

指定采样率,采样位数,声道数进行创建。

其中44100是采样率, AudioFormat.CHANNEL_OUT_STEREO 为双声道,还有 CHANNEL_OUT_MONO 单声道。 AudioFormat.ENCODING_PCM_16BIT 为采样位数16位,还有 ENCODING_PCM_8BIT 8位。 minBufferSize 是播放器缓冲的大小,也是根据采样率和采样位数,声道数 进行获取,只有满足最小的buffer才去操作底层进程播放。

最后一个参数mode。可以指定的值有 AudioTrack.MODE_STREAM 和 AudioTrack.MODE_STATIC 。

MODE_STREAM 适用于大多数的场景,比如动态的处理audio buffer,或者播放很长的音频文件,它是将audio buffers从java层传递到native层。音频播放时音频数据从Java流式传输到native层的创建模式。

MODE_STATIC 适用场景,比如播放很短的音频,它是一次性将全部的音频资源从java传递到native层。音频数据在音频开始播放前仅从Java传输到native层的创建模式。

是的,就这么一个方法。注意此方法是同步方法,是个耗时方法,一般是开启一个线程循环调用 write 方法进行写入。

注意在调用 write 方法前需要调用 audioTrack.play() 方法开始播放。

因为是pcm裸数据,无法像mediaplayer一样提供了API。所以需要自己处理下。可以利用 getPlaybackHeadPosition 方法。

getPlaybackHeadPosition() 的意思是返回以帧为单位表示的播放头位置

getPlaybackRate() 的意思是返回以Hz为单位返回当前播放采样率。

所以当前播放时间可以通过如下方式获取

OpenSLES:(Open Sound Library for Embedded Systems).

OpenSLES是跨平台是针对嵌入式系统精心优化的硬件音频加速API。使用OpenSLES进行音频播放的好处是可以不依赖第三方。比如一些音频或者视频播放器中都是用OpenSLES进行播放解码后的pcm的,这样免去了和java层的交互。

在Android中使用OpenSLES首先需要把Android 系统提供的so链接到外面自己的so。在CMakeLists.txt脚本中添加链接库OpenSLES。库的名字可以在 类似如下目录中

需要去掉lib

然后导入头文件即可使用了OpenSLES提供的底层方法了。

创建使用的步骤大致分为:

一个 SLObjectItf 里面可能包含了多个Interface,获取Interface通过 GetInterface 方法,而 GetInterface 方法的地2个参数 SLInterfaceID 参数来指定到的需要获取Object里面的那个Interface。比如通过指定 SL_IID_ENGINE 的类型来获取 SLEngineItf 。我们可以通过 SLEngineItf 去创建各种Object,例如播放器、录音器、混音器的Object,然后在用这些Object去获取各种Interface去实现各种功能。

如上所说,SLEngineItf可以创建混音器的Object。

在创建播放器前需要创建音频的配置信息(比如采样率,声道数,每个采样的位数等)

开始播放后会不断的回调这个 pcmBufferCallBack 函数将音频数据压入队列

(*pcmBufferQueue)-RegisterCallback(pcmBufferQueue, pcmBufferCallBack, this);

如果想要暂停播放参数直接设置为SL_PLAYSTATE_PAUSED,若暂停后继续播放设置参数为SL_PLAYSTATE_PLAYING即可。若想要停止播放参数设置为SL_PLAYSTATE_STOPPED即可。

首先获取播放器的用于控制音量的接口SLVolumeItf pcmVolumePlay

然后动态设置

首先也是获取播放器的用于控制音量的接口SLMuteSoloItf pcmMutePlay

然后动态设置

看起来控制还是蛮简单的哈。先熟悉这么多,OpenSLES还是蛮强大的。

Android ijkplayer详细使用步骤

ijkplayer是Bilibili基于ffmpeg开发并开源的轻量级视频播放器,支持播放本地网络视频,也支持流媒体播放。支持AndroidiOS。

ijkplayer的编译这里不多阐述,我也是直接获取别人编译完成的so库文件,直接使用的。如果你对ijkplayer的编译感兴趣,可以百度一下,有很多文章。

使用ijkplayer

导包

ijkplayer源码官方下载地址:

上面是官方提供的ijkplayer的源码地址,但是它是没有编译过的。下面我给大家分享一份编译好的ijkplayer源码,由于比较大,分了三个包才上传完成,需要三个包都下载后才能一起解压:

编译好的ijkplayer.part1

编译好的ijkplayer.part2

编译好的ijkplayer.part3

我们下载完成,进入android/ijkplayer目录:

ijkplayer-java:ijkplayer的一些操作封装及定义。这里面是通用的API接口,里面最主要的是IMediaPlayer,它是用来渲染显示多媒体的。

ijkplayer-exo:google开源的一个新的播放器ExoPlayer,在Demo中和ijkplayer对比用的。通过安装ijkplayer可以发现setting里面可以选择不同player来渲染多媒体显示,该模块下面就是一个MediaPlayer。

ijkplayer-example:测试程序

ijkplayer-{arch}:编译出来的各个版本的.so文件。

官方提供的Demo的代码还是挺多的,甚至还用了otto,需要对官方的demo进行精简,去除一些用不到的代码。

首先需要的是ijkplayer-{arch}、ijkplayer-Java两个库。exo是Google提供的新的播放器,这里不需要,直接砍掉。其次是ijkplayer-example里的,我们需要的只有tv.danmaku.ijk.media.example.widget.media包下的部分类。

注:

链接库ijkplayer-arm64,ijkplayer-armv5,ijkplayer-armv7a,ijkplayer-x86,ijkplayer-x86_64是不同体系架构的动态链接库,在当前工程结构里面作为一个模块,如果不想做兼容多平台问题,可以删除其他目录结构,单独保留自己需要的平台目录。

新建一个工程:

(1)把ijkplayer-armv7a/src/main/libs下的文件拷贝到新工程app目录的libs下。

(2)把ijkplayer-java/build/outputs/aar/ijkplayer-java-release.aar复制到新工程app目录的libs下。

(3)修改APP下的build.gradle, 主要设置.so及.aar的位置:

apply plugin: 'com.android.application'

android {

compileSdkVersion 24

buildToolsVersion "25.0.0"

defaultConfig {

applicationId "com.hx.ijkplayer_demo"

minSdkVersion 14

targetSdkVersion 24

versionCode 1

versionName "1.0"

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

}

buildTypes {

release {

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

}

}

sourceSets {

main {

jniLibs.srcDirs = ['libs'] /**在libs文件夹下找so文件*/

}

}

}

repositories {

mavenCentral()

flatDir {

dirs 'libs' /**在libs文件夹下找aar文件*/

}

}

dependencies {

compile fileTree(dir: 'libs', include: ['*.jar'])

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {

exclude group: 'com.android.support', module: 'support-annotations'

})

compile 'com.android.support:appcompat-v7:24.2.1'

testCompile 'junit:junit:4.12'

compile(name: 'ijkplayer-java-release', ext: 'aar') /**编译ijkplayer-java-release.aar文件*/

}

(4)复制ijkplayer-example下面的tv.danmaku.ijk.media.example.widget.media到新的工程,删掉一些不需要类。

(5)IjkVideoView里面还是有很多如exo等没用的东西,删!具体可以参见我后面的Demo。

(6)Manifest

...

activity android:name=".MainActivity"

android:screenOrientation="sensorLandscape"

android:configChanges="orientation|keyboardHidden"

...

/activity

...

uses-permission android:name="android.permission.INTERNET"/

想写个 App 练手,有什么有趣的 API 接口推荐吗

也不知道你需要的是哪类的,看下面的这些:

历史上的今天API接口、股票数据API接口、全国WIFI接口、星座运势接口、语音识别接口、周公解梦接口、天气预报API接口、笑话大全API接口、邮编查询接口、老黄历接口、成语词典接口、新闻头条接口、IP地址接口、问答机器人接口

可以在聚合数据上找到,都是免#费的,注册账号之后需要实?名申请,那上面还有一些其他的,你可以看看

看剧的软件哪个最全是免费的

看剧的免费软件:

1、《今日影视》

将大量网络上的公开视频资源整合到了一起,大家可以发现在观看的时候也是带有多条线路自由选择,这在我们观影的时候提供了巨大的便利,在遇到卡顿或者是缓存失败的情况下能够通过切换节点和线路来解决,而不用更换app了。

软件本身的资源也是非常多,在遇到资源无效的时候联系客服就可以反馈,总体使用的体验还是相当不错的。

2、《番茄影视》

其本身是一款本地视频播放器,对很多视频合适都提供了较为完美的支持,自带有强大的解码器和渲染引擎,能够大幅提升播放以及控制操作的响应速度,另外还支持了smtp.m3u8等在线视频节目和流媒体播放,在其他视频服务商平台获取订阅链接之后也可以一键导入。

不仅如此,平台本身也是带有一些第三方的API接口,能够随时享受到海量的在线视频内容。

3、《爱看影视》

软件资源库中的内容还是非常齐全的,不仅包括目前热播的影视剧、综艺等,还有一些精品的动漫动画、纪录片等。系统的设定非常的丰富,极简的界面让用户使用起来非常的方便。

你可以在搜索栏里边根据时间,地区,题材,等标签来进行筛选,或者直接输入喜欢作品的名字,多个播放器的线路,出现各种播放问题都是可以进行切换更正的,再也不会出现剧荒的现象啦。

4、《好看影视大全》

这里的更新速度相对比其他的平台来说是非常的快,基本上一些特别火的节目当天都是可以观看的到。没有那些乱七八糟的广告弹窗,水印也会被毙掉。

5、《今日影视大全》

除了一些网播电影之外,也有大量的院线资源,不仅更新速度快,还带有多种版本可以选择,像一些多配音的电影或者电视剧,在观看的时候就能够进行音轨的切换,满足不同用户的喜好和习惯。软件支持批量离线缓存,下载结束后就能够不消耗流量放心观看了。

WPF视频播放器

对此有两种解决方法:

1) 查看你所用的播放器是否有公开api接口,调用其中的函数.这种实现可能行较小,估计不是开源的.

2)利用wpf的可视化树获取此播放器,再进行截图当前画面.这种可行性高,而且图片不会失真,可以尝试调研,网上有很多例子.

更换视频内核是什么意思

是说需要换一种路径来播放视频。

播放器内核切换

不同的视频播放器内核,由于api不一样,所以难以切换操作。要是想兼容内核切换,就必须自己制定一个视频接口+实现类的播放器

一定要相耦合

播放器内核与播放器解耦: 支持更多的播放场景、以及新的播放业务快速接入,并且不影响其他播放业务,比如后期添加阿里云播放器内核,或者腾讯播放器内核

传入不同类型方便创建不同内核

隐藏内核播放器创建具体细节,开发者只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体播放器类的类名。需要符合开闭原则。

(责任编辑:IT教学网)

更多