音频播放开发指导

About 7 min

音频播放开发指导

场景介绍

音频播放的主要工作是将音频数据转码为可听见的音频模拟信号并通过输出设备进行播放,同时对播放任务进行管理。

图 1 音频播放状态机

接口说明

表 1 media

接口名

描述

media.createAudioPlayer()

创建AudioPlayer实例。

AudioPlayer

提供音频播放相关功能,具体见表 音频播放相关的interface AudioPlayer。

表 2 音频播放相关的interface AudioPlayer

接口名

描述

release()

释放音频资源。

play()

开始播放音频源。

pause()

暂停播放。

stop()

停止播放。

reset()7+

重置播放音频源。

setVolume(vol: number)

改变音频播放音量

seek(timeMs: number)

改变播放位置。

src:string

音频播放的媒体URI。

state:AudioState

播放的状态属性。

currentTime:number

音频的当前播放位置。

duration:number

音频播放的时长。

loop:boolean

音频的循环播放属性。

on('play', function callback)

订阅音频播放开始事件。

on('pause', function callback)

订阅音频播放暂停事件。

on('stop', function callback)

订阅音频播放停止事件。

on('reset', function callback)

订阅音频播放重置事件。

on('finish',function callback)

订阅音频播放结束事件。

on('error', function callback)

订阅音频播放错误事件。

on('dataload', function callback)

订阅音频播放加载数据事件。

on('volumeChange', function callback)

订阅音频播放音量变化事件。

on('timeUpdate', function callback)

订阅音频播放进度改变事件。

  1. 创建音频播放器。

    import media from '@ohos.multimedia.media';
    var player = media.createAudioPlayer();
    
    1
    2
  2. 设置消息订阅事件。

    player.on('play', (err, action) => {
        if (err) {
            console.error('Error returned in the play() callback.');
            return;
         }
         console.info('Current player duration: '+ player.duration);
         console.info('Current player time: ' + player.currentTime);
         console.info('Current player status: '+player.state);
         console.info('Pause MP3');
         player.pause();
    });
    player.on('pause', (err, action) => {
         if (err) {
             console.error('Error returned in the pause() callback.');
             return;
          }
          console.info('Current player status: ' + player.state);
          console.info('Current player time: ' + player.currentTime);
          player.seek(30000); // Seek for 30 seconds.
    });
    player.on('stop', (err, action) => {
        if (err) {
            console.error('Error returned in the stop() callback.');
            return;
        }
        console.info('stop callback invoked. State:' + player.state);
        player.reset();
    });
    player.on('dataLoad', (err, action) => {
        if (err) {
            console.error('Error returned in the dataLoad() callback.');
            return;
        }
         console.info('dataLoad callback invoked. Current time: ' + player.currentTime);
         console.info('Duration of the source:' + player.duration);
         player.play();
    });
    player.on('reset', (err, action) => {
        if (err) {
            console.error('Error returned in the reset() callback.');
            return;
        }
        console.info('reset callback invoked.');
        player.release();
    });
    player.on('finish', (err, action) => {
         if (err) {
            console.error('Error returned in the finish() callback.');
            return;
         }
         console.info('finish callback invoked.');
    });
    player.on('timeUpdate', (seekTime, action) => {
        console.info('Seek time: ' + seekTime);
        console.info('Current player time: ' + player.currentTime);
        var newTime = player.currentTime;
        if(newTime == 30000) {
            console.info('Seek succeeded. New time: ' + newTime);
        } else {
            console.error('Seek failed: ', + newTime);
         }
            player.stop();
    });
    player.on('error', (err) => {
         console.error('Player error: ${err.message}');
    });
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
  3. 启动播放。

    var audioSourceMp3 = 'file://test.mp3';
    player.src = audioSourceMp3;
    player.loop = true;
    
    1
    2
    3