@nativescript-community/audio
用于录制和播放音频的 NativeScript 插件。
npm i --save @nativescript-community/audio

@nativescript-community/audio

Downloads per month NPM Version

用于录制和播放音频的 NativeScript 插件。


iOS 示例 Android 示例

目录

安装

从项目的根目录运行以下命令

ns plugin add @nativescript-community/audio

安装

ns plugin add @nativescript-community/audio

Android 原生类

iOS 原生类

权限

iOS

如果您使用录音功能,需要在 iOS 上授予权限以允许设备访问麦克风。如果不这样做,您的应用可能在设备上崩溃,或者您的应用可能在苹果的审查过程中被拒绝。为此,请将此键添加到您的 app/App_Resources/iOS/Info.plist 文件中

<key>NSMicrophoneUsageDescription</key>
<string>Recording Practice Sessions</string>

Android

如果您打算为 Android 使用录制器功能,则需要将 RECORD_AUDIO 权限添加到位于 App_Resources 的 AndroidManifest.xml 文件中。

    <uses-permission android:name="android.permission.RECORD_AUDIO"/>

使用方法

TypeScript 示例

import { TNSPlayer } from '@nativescript-community/audio';

export class YourClass {
private _player: TNSPlayer;

constructor() {
this._player = new TNSPlayer();
// You can pass a duration hint to control the behavior of other application that may
// be holding audio focus.
// For example: new TNSPlayer(AudioFocusDurationHint.AUDIOFOCUS_GAIN_TRANSIENT);
// Then when you play a song, the previous owner of the
// audio focus will stop. When your song stops
// the previous holder will resume.
this._player.debug = true; // set true to enable TNSPlayer console logs for debugging.
this._player
.initFromFile({
audioFile: '~/audio/song.mp3', // ~ = app directory
loop: false,
completeCallback: this._trackComplete.bind(this),
errorCallback: this._trackError.bind(this)
})
.then(() => {
this._player.getAudioTrackDuration().then(duration => {
// iOS: duration is in seconds
// Android: duration is in milliseconds
console.log(`song duration:`, duration);
});
});
}

public togglePlay() {
if (this._player.isAudioPlaying())
{
this._player.pause();
} else {
this._player.play();
}
}

private _trackComplete(args: any) {
console.log('reference back to player:', args.player);
// iOS only: flag indicating if completed succesfully
console.log('whether song play completed successfully:', args.flag);
}

private _trackError(args: any) {
console.log('reference back to player:', args.player);
console.log('the error:', args.error);
// Android only: extra detail on error
console.log('extra info on the error:', args.extra);
}
}

JavaScript 示例

const audio = require('@nativescript-community/audio');

const player = new audio.TNSPlayer();
const playerOptions = {
audioFile: 'http://some/audio/file.mp3',
loop: false,
completeCallback: function () {
console.log('finished playing');
},
errorCallback: function (errorObject) {
console.log(JSON.stringify(errorObject));
},
infoCallback: function (args) {
console.log(JSON.stringify(args));
}
};

player
.playFromUrl(playerOptions)
.then(res => {
console.log(res);
})
.catch(err => {
console.log('something went wrong...', err);
});

API

录制器

TNSRecorder 方法

方法 描述
TNSRecorder.CAN_RECORD(): boolean - 静态方法 确定是否准备好录制。
start(options: AudioRecorderOptions): Promise<void> 开始录制到文件。
stop(): Promise<void> 停止录制。
pause(): Promise<void> 暂停录制。
resume(): Promise<void> 恢复录制。
dispose(): Promise<void> 完成录制后释放系统资源。
getMeters(channel?: number): number 返回输入的振幅。
isRecording(): boolean - iOS 仅 如果录制器正在积极录制,则返回 true。
requestRecordPermission(): Promise<void> Android 仅 用户授予权限时解析承诺。
hasRecordPermission(): boolean Android 仅 如果已授予权限 RECORD_AUDIO,则返回 true。

TNSRecorder 实例属性

属性 描述
ios 获取原生 AVAudioRecorder 类实例。
android 获取原生 MediaRecorder 类实例。
debug 将 true 设置为启用调试控制台日志(默认为 false)。

播放器

TNSPlayer 方法

方法 描述
initFromFile(options: AudioPlayerOptions): Promise 使用文件初始化播放器实例而不自动播放。
playFromFile(options: AudioPlayerOptions): Promise 从文件自动播放。
initFromUrl(options: AudioPlayerOptions): Promise 从 URL 初始化播放器实例而不自动播放。
playFromUrl(options: AudioPlayerOptions): Promise 从 URL 自动播放。
pause(): Promise<boolean> 暂停播放。
resume(): void 恢复播放。
seekTo(time:number): Promise<boolean> 跳转到音轨的指定位置(以秒为单位)。
dispose(): Promise<boolean> 播放完成后释放资源。
isAudioPlaying(): boolean 确定播放器是否正在播放。
getAudioTrackDuration(): Promise<string> 分配给播放器的媒体文件时长。
playAtTime(time: number): void - 仅限iOS 在指定的时间点播放音频音轨。
changePlayerSpeed(speed: number): void - 仅限Android API 23+ 更改媒体播放器的播放速度。

TNSPlayer 实例属性

属性 描述
ios 获取原生iOS AVAudioPlayer实例。
android 获取原生Android MediaPlayer实例。
debug: boolean 将 true 设置为启用调试控制台日志(默认为 false)。
currentTime: number 获取媒体文件持续时间的当前时间。
volume: number 获取/设置播放器音量。值范围从0到1。

许可证

MIT

示例和开发

仓库设置

该仓库使用子模块。如果您没有使用 --recursive克隆,则需要调用

git submodule update --init

用于安装和链接依赖项的包管理器必须是pnpmyarnnpm不可用。

开发和测试:如果您使用yarn,则运行yarn;如果您使用pnpm,则运行pnpm i

交互式菜单

要启动交互式菜单,请运行npm start(或yarn startpnpm start)。这将列出所有常用的脚本。

构建

npm run build.all

警告:似乎yarn build.all并不总是有效(在node_modules/.bin中找不到二进制文件),这就是为什么文档明确使用npm run

示例

npm run demo.[ng|react|svelte|vue].[ios|android]

npm run demo.svelte.ios # Example

示例设置有一些特殊之处,即如果您想修改/添加示例,您不必直接在demo-[ng|react|svelte|vue]中工作。相反,您应在demo-snippets/[ng|react|svelte|vue]中工作。您可以从每个版本的install.ts开始,看看如何注册新的示例。

贡献

更新仓库

您可以非常容易地更新仓库文件。

首先更新子模块

npm run update

然后提交更改,然后更新公共文件

npm run sync

然后您可以运行yarn|pnpm,如果有任何更改,请提交更改的文件

更新 README

npm run readme

更新文档

npm run doc

发布

发布完全由lerna处理(您可以使用-- --bump major强制发布主要版本)只需运行

npm run publish

修改子模块

该仓库使用https://子模块,这意味着您无法直接推送到子模块。一个简单的解决方案是修改~/.gitconfig并添加

[url "ssh://[email protected]/"]
pushInsteadOf = https://github.com/

问题

如果您有任何问题/问题/评论,请随时创建问题或开始与NativeScript社区Discord的对话。