GVKun编程网logo

iOS音频Error(ios音频输出设置)

11

对于想了解iOS音频Error的读者,本文将提供新的信息,我们将详细介绍ios音频输出设置,并且为您提供关于CentOS6.8安装RabbitMQ提示ERROR:epmderrorforhost"77

对于想了解iOS音频Error的读者,本文将提供新的信息,我们将详细介绍ios音频输出设置,并且为您提供关于CentOS 6.8 安装RabbitMQ提示ERROR: epmd error for host "77": badarg (unknown POSIX error)、ERROR OSError: Errno 28 设备上没有剩余空间、flex4 Error #2044: 未处理的 IOErrorEvent: text=Error #2032: 流错误、HarmonyOS音频开发指导:使用AudioRenderer开发音频播放功能的有价值信息。

本文目录一览:

iOS音频Error(ios音频输出设置)

iOS音频Error(ios音频输出设置)

最近在cocos应用上发现一个比较奇怪的bug,当应用正在调用录音的时候,按下home键回到后台,然后打开一个音乐播放器播放一个音乐,再回到游戏中游戏就会卡死。

之前录音和播放设置是下方:

播放:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil];

 录音:

[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:nil];

 恢复正常

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];

 

个人思路:

音频输出作为硬件资源,对于iOS系统来说是唯一的。

音乐播放器在播放器占用了游戏的硬件资源。导致游戏卡死。

cocos爆出的errorLog也印证了这一点

Log:

D/AudioEngine-inl.mm (198): Audio session is still interrupted, pause director!

 

经过查询,特别感谢https://www.jianshu.com/p/3e0a399380df

 是否引起不支持混音的APP中断。

后面把设置修改为

播放:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker|AVAudioSessionCategoryOptionMixWithOthers error:nil];

 录音:

[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers|AVAudioSessionCategoryOptionDefaultToSpeaker error:nil];

 恢复正常:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategorySoloAmbient withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker|AVAudioSessionCategoryOptionMixWithOthers error:nil];

 问题解决。

AVAudioSessionCategoryOptionDefaultToSpeaker  是为了设置扬声器播放,原因:切换成录音状态时会改为听筒播放

 

!!!

emmm,上面方法虽然可以解决问题,但是会出现一点:每次录音都要切换状态会重新走一遍准备录音环境的流程,在应用中就是会卡顿一丢丢。如果对程序有较高的要求,出现这个问题明显是不行的。

最后解决方案:

在每次调用录音单例类的时候调用一下状态切换

+ (void)initRecorder{
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setActive:YES error:nil];
    [session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers|AVAudioSessionCategoryOptionDefaultToSpeaker error:nil];

然后切换播放环境不改变category,因为前面用的是PlayAndRecord。

什么时候切换成默认状态呢,这个需要cocos端在退出需要录音环境的页面是来通知一下iOS端,然后我们

 

+ (void)finish{
    if (player.playing) {
        [player stop];
    }
    if (recorder.recording){
        [recorder stop];
    }
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker|AVAudioSessionCategoryOptionMixWithOthers error:nil];
}

 

 这个真的是我认为的最优解了。。有更好的解放方案的同学可以在下方留言一起探讨。

CentOS 6.8 安装RabbitMQ提示ERROR: epmd error for host

CentOS 6.8 安装RabbitMQ提示ERROR: epmd error for host "77": badarg (unknown POSIX error)

今天在linux 服务器(系统版本:CentOS 6.8) 安装 RabbitMQ过程中,遇到一些问题,解决方案记录下来供大家参考:

先说说安装过程:

第一步:安装erlang以root身份执行下面命令: yum install erlang

第二步:wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.5.0/rabbitmq-server-3.5.0-1.noarch.rpm

第三步:rpm -ivhrabbitmq-server-3.5.0-1.noarch.rpm

第四步:rabbitmq-server --detached&ps aux |grep rabbitmq

如果显示以下信息:


说明安装成功

如果报以下错误:

ERROR: epmd error for host "77":badarg (unkNown POSIX error)

解决办法:

# vi/etc/rabbitmq/rabbitmq-env.conf

在文件里面添加这一行:NODENAME=rabbit@localhost,保存

(注意:rabbitmq-env.conf这个文件没有,打开之后自动创建)

# service rabbitmq-server start

Rabbitmq server 成功启动!

ERROR OSError: Errno 28 设备上没有剩余空间

ERROR OSError: Errno 28 设备上没有剩余空间

如何解决ERROR OSError: Errno 28 设备上没有剩余空间?

AWS Lambda

首先,当我将模型从 s3 存储桶直接下载到 lambda 函数 tmp 目录时,我遇到了这个问题。因此,为了解决空间错误,我采用了 Docker Container 方法。我必须Dockerized我的模型,然后将它上传到AWS ECR Repository,然后从container image创建一个lambda函数,但我仍然拥有这个No Space Left Error

请建议可以做什么。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

flex4 Error #2044: 未处理的 IOErrorEvent: text=Error #2032: 流错误

flex4 Error #2044: 未处理的 IOErrorEvent: text=Error #2032: 流错误

总结

以上是小编为你收集整理的flex4 Error #2044: 未处理的 IOErrorEvent: text=Error #2032: 流错误全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

HarmonyOS音频开发指导:使用AudioRenderer开发音频播放功能

HarmonyOS音频开发指导:使用AudioRenderer开发音频播放功能

AudioRenderer 是音频渲染器,用于播放 PCM(Pulse Code Modulation)音频数据,相比 AVPlayer 而言,可以在输入前添加数据预处理,更适合有音频开发经验的开发者,以实现更灵活的播放功能。

开发指导
使用 AudioRenderer 播放音频涉及到 AudioRenderer 实例的创建、音频渲染参数的配置、渲染的开始与停止、资源的释放等。本开发指导将以一次渲染音频数据的过程为例,向开发者讲解如何使用 AudioRenderer 进行音频渲染,建议搭配AudioRenderer的API说明阅读。

下图展示了 AudioRenderer 的状态变化,在创建实例后,调用对应的方法可以进入指定的状态实现对应的行为。需要注意的是在确定的状态执行不合适的方法可能导致 AudioRenderer 发生错误,建议开发者在调用状态转换的方法前进行状态检查,避免程序运行产生预期以外的结果。

为保证 UI 线程不被阻塞,大部分 AudioRenderer 调用都是异步的。对于每个 API 均提供了 callback 函数和 Promise 函数,以下示例均采用 callback 函数。

图 1 AudioRenderer 状态变化示意图
图片

在进行应用开发的过程中,建议开发者通过 on(''stateChange'')方法订阅 AudioRenderer 的状态变更。因为针对 AudioRenderer 的某些操作,仅在音频播放器在固定状态时才能执行。如果应用在音频播放器处于错误状态时执行操作,系统可能会抛出异常或生成其他未定义的行为。
● prepared 状态: 通过调用 createAudioRenderer()方法进入到该状态。
● running 状态: 正在进行音频数据播放,可以在 prepared 状态通过调用 start()方法进入此状态,也可以在 paused 状态和 stopped 状态通过调用 start()方法进入此状态。
● paused 状态: 在 running 状态可以通过调用 pause()方法暂停音频数据的播放并进入 paused 状态,暂停播放之后可以通过调用 start()方法继续音频数据播放。
● stopped 状态: 在 paused/running 状态可以通过 stop()方法停止音频数据的播放。
● released 状态: 在 prepared、paused、stopped 等状态,用户均可通过 release()方法释放掉所有占用的硬件和软件资源,并且不会再进入到其他的任何一种状态了。

开发步骤及注意事项
1.  配置音频渲染参数并创建 AudioRenderer 实例,音频渲染参数的详细信息可以查看AudioRendererOptions。

import audio from ''@ohos.multimedia.audio'';

let audioStreamInfo = {
  samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100,
  channels: audio.AudioChannel.CHANNEL_1,
  sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
  encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
};

let audioRendererInfo = {
  content: audio.ContentType.CONTENT_TYPE_SPEECH,
  usage: audio.StreamUsage.STREAM_USAGE_VOICE_COMMUNICATION,
  rendererFlags: 0
};

let audioRendererOptions = {
  streamInfo: audioStreamInfo,
  rendererInfo: audioRendererInfo
};

audio.createAudioRenderer(audioRendererOptions, (err, data) => {
  if (err) {
    console.error(`Invoke createAudioRenderer failed, code is ${err.code}, message is ${err.message}`);
    return;
  } else {
    console.info(''Invoke createAudioRenderer succeeded.'');
    let audioRenderer = data;
  }
});

2.  调用 start()方法进入 running 状态,开始渲染音频。

audioRenderer.start((err) => {
  if (err) {
    console.error(`Renderer start failed, code is ${err.code}, message is ${err.message}`);
  } else {
    console.info(''Renderer start success.'');
  }
});

3.  指定待渲染文件地址,打开文件调用 write()方法向缓冲区持续写入音频数据进行渲染播放。如果需要对音频数据进行处理以实现个性化的播放,在写入之前操作即可。

const bufferSize = await audioRenderer.getBufferSize();
let file = fs.openSync(filePath, fs.OpenMode.READ_ONLY);
let buf = new ArrayBuffer(bufferSize);
let readsize = await fs.read(file.fd, buf);
let writeSize = await new Promise((resolve, reject) => {
  audioRenderer.write(buf, (err, writeSize) => {
    if (err) {
      reject(err);
    } else {
      resolve(writeSize);
    }
  });
});

4.  调用 stop()方法停止渲染。

audioRenderer.stop((err) => {
  if (err) {
    console.error(`Renderer stop failed, code is ${err.code}, message is ${err.message}`);
  } else {
    console.info(''Renderer stopped.'');
  }
});

5.  调用 release()方法销毁实例,释放资源。

audioRenderer.release((err) => {
  if (err) {
    console.error(`Renderer release failed, code is ${err.code}, message is ${err.message}`);
  } else {
    console.info(''Renderer released.'');
  }
});

完整示例

import audio from ''@ohos.multimedia.audio'';
import fs from ''@ohos.file.fs'';

const TAG = ''AudioRendererDemo'';

export default class AudioRendererDemo {
  private renderModel = undefined;
  private audioStreamInfo = {
    samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000, // 采样率
    channels: audio.AudioChannel.CHANNEL_2, // 通道
    sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式
    encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式
  }
  private audioRendererInfo = {
    content: audio.ContentType.CONTENT_TYPE_MUSIC, // 媒体类型
    usage: audio.StreamUsage.STREAM_USAGE_MEDIA, // 音频流使用类型
    rendererFlags: 0 // 音频渲染器标志
  }
  private audioRendererOptions = {
    streamInfo: this.audioStreamInfo,
    rendererInfo: this.audioRendererInfo
  }

  // 初始化,创建实例,设置监听事件
  init() {
    audio.createAudioRenderer(this.audioRendererOptions, (err, renderer) => { // 创建AudioRenderer实例
      if (!err) {
        console.info(`${TAG}: creating AudioRenderer success`);
        this.renderModel = renderer;
        this.renderModel.on(''stateChange'', (state) => { // 设置监听事件,当转换到指定的状态时触发回调
          if (state == 2) {
            console.info(''audio renderer state is: STATE_RUNNING'');
          }
        });
        this.renderModel.on(''markReach'', 1000, (position) => { // 订阅markReach事件,当渲染的帧数达到1000帧时触发回调
          if (position == 1000) {
            console.info(''ON Triggered successfully'');
          }
        });
      } else {
        console.info(`${TAG}: creating AudioRenderer failed, error: ${err.message}`);
      }
    });
  }

  // 开始一次音频渲染
  async start() {
    let stateGroup = [audio.AudioState.STATE_PREPARED, audio.AudioState.STATE_PAUSED, audio.AudioState.STATE_STOPPED];
    if (stateGroup.indexOf(this.renderModel.state) === -1) { // 当且仅当状态为prepared、paused和stopped之一时才能启动渲染
      console.error(TAG + ''start failed'');
      return;
    }
    await this.renderModel.start(); // 启动渲染

    const bufferSize = await this.renderModel.getBufferSize();
    let context = getContext(this);
    let path = context.filesDir;
    const filePath = path + ''/test.wav''; // 使用沙箱路径获取文件,实际路径为/data/storage/el2/base/haps/entry/files/test.wav

    let file = fs.openSync(filePath, fs.OpenMode.READ_ONLY);
    let stat = await fs.stat(filePath);
    let buf = new ArrayBuffer(bufferSize);
    let len = stat.size % bufferSize === 0 ? Math.floor(stat.size / bufferSize) : Math.floor(stat.size / bufferSize + 1);
    for (let i = 0; i < len; i++) {
      let options = {
        offset: i * bufferSize,
        length: bufferSize
      };
      let readsize = await fs.read(file.fd, buf, options);

      // buf是要写入缓冲区的音频数据,在调用AudioRenderer.write()方法前可以进行音频数据的预处理,实现个性化的音频播放功能,AudioRenderer会读出写入缓冲区的音频数据进行渲染

      let writeSize = await new Promise((resolve, reject) => {
        this.renderModel.write(buf, (err, writeSize) => {
          if (err) {
            reject(err);
          } else {
            resolve(writeSize);
          }
        });
      });
      if (this.renderModel.state === audio.AudioState.STATE_RELEASED) { // 如果渲染器状态为released,停止渲染
        fs.close(file);
        await this.renderModel.stop();
      }
      if (this.renderModel.state === audio.AudioState.STATE_RUNNING) {
        if (i === len - 1) { // 如果音频文件已经被读取完,停止渲染
          fs.close(file);
          await this.renderModel.stop();
        }
      }
    }
  }

  // 暂停渲染
  async pause() {
    // 只有渲染器状态为running的时候才能暂停
    if (this.renderModel.state !== audio.AudioState.STATE_RUNNING) {
      console.info(''Renderer is not running'');
      return;
    }
    await this.renderModel.pause(); // 暂停渲染
    if (this.renderModel.state === audio.AudioState.STATE_PAUSED) {
      console.info(''Renderer is paused.'');
    } else {
      console.error(''Pausing renderer failed.'');
    }
  }

  // 停止渲染
  async stop() {
    // 只有渲染器状态为running或paused的时候才可以停止
    if (this.renderModel.state !== audio.AudioState.STATE_RUNNING && this.renderModel.state !== audio.AudioState.STATE_PAUSED) {
      console.info(''Renderer is not running or paused.'');
      return;
    }
    await this.renderModel.stop(); // 停止渲染
    if (this.renderModel.state === audio.AudioState.STATE_STOPPED) {
      console.info(''Renderer stopped.'');
    } else {
      console.error(''Stopping renderer failed.'');
    }
  }

  // 销毁实例,释放资源
  async release() {
    // 渲染器状态不是released状态,才能release
    if (this.renderModel.state === audio.AudioState.STATE_RELEASED) {
      console.info(''Renderer already released'');
      return;
    }
    await this.renderModel.release(); // 释放资源
    if (this.renderModel.state === audio.AudioState.STATE_RELEASED) {
      console.info(''Renderer released'');
    } else {
      console.error(''Renderer release failed.'');
    }
  }
}

当同优先级或高优先级音频流要使用输出设备时,当前音频流会被中断,应用可以自行响应中断事件并做出处理。具体的音频并发处理方式可参考多音频播放的并发策略。

我们今天的关于iOS音频Errorios音频输出设置的分享已经告一段落,感谢您的关注,如果您想了解更多关于CentOS 6.8 安装RabbitMQ提示ERROR: epmd error for host "77": badarg (unknown POSIX error)、ERROR OSError: Errno 28 设备上没有剩余空间、flex4 Error #2044: 未处理的 IOErrorEvent: text=Error #2032: 流错误、HarmonyOS音频开发指导:使用AudioRenderer开发音频播放功能的相关信息,请在本站查询。

本文标签: