
# 播放音乐
#### 功能描述
混音是将音乐文件和麦克风音频混合，一般用于播放时长较长的背景音乐或者伴奏。同一时间只能播放一个音乐文件。可以在本地播放，也可以同时播放给其他与会者听。
支持播放wav、pcm和单声道mp3音频文件。可以播放本地或在线音乐文件。
 #### 接口调用步骤
![](https://support.huaweicloud.com/bestpractice-rtc/zh-cn_image_0000001226973279.png)
#### 实现过程
1. **加入房间**
   参考[接口调用步骤]中加入房间的时序图步骤加入房间。
   
2. **播放音乐文件**
   调用startAudioFile接口可以播放一个音乐文件。同一时刻只能播放一个音乐文件。
   ```
   engine->startAudioFile("D:\\test.mp3", true, 1, false, 0);
   ```
   
3. **设置音乐文件音量**
   音乐文件播放过程中，可以调用adjustAudioFileVolume设置音乐文件播放音量。
   ```
   engine->adjustAudioFileVolume(50);
   ```
   
4. **获取音乐文件总时长和播放位置**
   音乐文件打开成功后，Sdk会触发一次onAudioMixStateChangedNotify回调，传入state参数为HRTC_AUDIO_FILE_OPEN_COMPLETED，此时可以调用getAudioFileDuration获取音乐文件总时长，可用以刷新界面进度条的总时长。
   音乐文件在播放过程中，Sdk每秒会触发一次onAudioMixStateChangedNotify回调，其中的state参数为HRTC_AUDIO_FILE_POSITION_UPDATE，value参数就是当前的音乐文件播放进度，以毫秒为单位，可以在此回调中刷新界面的播放进度条。
   播放过程中也可以调用getAudioFilePosition获取音乐文件当前播放位置，可用于刷新界面的播放进度条。示例代码如下：
   ```
   void HWEngineEventHandler::onAudioMixStateChangedNotify(HRTCAudioFileState state, HRTCAudioFileReason reason, unsigned long long value)
   {
   switch (reason) {
   case HRTC_AUDIO_FILE_REASON_NONE:
   {
   switch (state) {
   case HRTC_AUDIO_FILE_OPEN_COMPLETED:
   {
   //获取总时长，并刷新到进度条
   int mixDuration = engine->getAudioFileDuration();
   break;
   }
   case HRTC_AUDIO_FILE_POSITION_UPDATE:
   {
   //使用value参数值刷新界面的播放进度条
   break;
   }
   case HRTC_AUDIO_FILE_PLAYING:
   {
   //刷新界面
   break;
   }
   case HRTC_AUDIO_FILE_PAUSED:
   {
   //刷新界面
   break;
   }
   case HRTC_AUDIO_FILE_STOPPED:
   {
   //刷新界面
   break;
   }
   case HRTC_AUDIO_FILE_PLAY_COMPLETED:
   {
   //刷新界面
   break;
   }
   }
   break;
   }
   Default:
   //错误信息提示
   }
   }
   ```
   
5. **设置音乐文件播放位置**
   播放过程中可以调用setAudioFilePosition设置音乐文件播放位置，可用于通过拖动进度条改变音乐文件的播放位置。
   ```
   engine-> setAudioFilePosition(50);
   ```
   
6. **暂停播放音乐文件**
   调用pauseAudioFile接口可以暂停播放一个音乐文件。
   ```
   engine->pauseAudioFile();
   ```
   
7. **恢复播放暂停的音乐文件**
   音乐文件暂停播放后，可以调用resumeAudioFile接口恢复播放。
   ```
   engine->resumeAudioFile();
   ```
   
8. **停止播放音乐文件**
   调用stopAudioFile接口可以停止播放音乐文件。
   ```
   engine->stopAudioFile();
   ```
   
9. **音乐文件播放结束回调**
   音乐文件播放结束后，sdk会触发onAudioMixStateChangedNotify回调，传入state参数为HRTC_AUDIO_FILE_PLAY_COMPLETED来通知上层应用。
   ```
   void HWEngineEventHandler::onAudioMixStateChangedNotify(HRTCAudioFileState state, HRTCAudioFileReason reason, unsigned long long value)
   {
       //收到音乐文件播放结束通知后，可以刷新界面，比如恢复播放前初始界面状态。
       if (state == HRTC_AUDIO_FILE_PLAY_COMPLETED) {
       }
   }
   ```
   
 
#### API参考
[startAudioFile](https://support.huaweicloud.com/csdk-rtc/rtc_05_0104.html#section0)
[adjustAudioFileVolume](https://support.huaweicloud.com/csdk-rtc/rtc_05_0104.html#section4)
[getAudioFileDuration](https://support.huaweicloud.com/csdk-rtc/rtc_05_0104.html#section8)
[getAudioFilePosition](https://support.huaweicloud.com/csdk-rtc/rtc_05_0104.html#section9)
[setAudioFilePosition](https://support.huaweicloud.com/csdk-rtc/rtc_05_0104.html#section10)
[pauseAudioFile](https://support.huaweicloud.com/csdk-rtc/rtc_05_0104.html#section2)
[resumeAudioFile](https://support.huaweicloud.com/csdk-rtc/rtc_05_0104.html#section3)
[stopAudioFile](https://support.huaweicloud.com/csdk-rtc/rtc_05_0104.html#section1)
[onAudioMixStateChangedNotify](https://support.huaweicloud.com/csdk-rtc/rtc_05_0115.html#section98)
