You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

创建PJSIP音频播放器遇70006错误(PJ_ENOTFOUND)求解决方案

解决PJSIP创建音频播放器时的70006(PJ_ENOTFOUND)错误

这个错误本质是PJSIP找不到你指定的音频文件——毕竟你用的asset目录是Android应用的私有资源目录,PJSIP的底层库没法直接访问它,咱们一步步来解决:

第一步:把Asset中的WAV文件复制到本地可访问路径

PJSIP的createPlayer方法需要能直接读取的文件系统路径,所以先把asset里的文件复制到应用的内部存储(比如files目录),这样PJSIP就能找到它了。

先写个工具方法完成复制:

private String copyAssetToLocal(Context context, String assetFileName) {
    // 目标文件路径:应用内部files目录
    File localFile = new File(context.getFilesDir(), assetFileName);
    
    // 如果文件已经存在,直接返回路径
    if (localFile.exists()) {
        return localFile.getAbsolutePath();
    }

    // 从asset读取并写入本地文件
    try (InputStream assetStream = context.getAssets().open(assetFileName);
         FileOutputStream localStream = new FileOutputStream(localFile)) {
        
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = assetStream.read(buffer)) != -1) {
            localStream.write(buffer, 0, bytesRead);
        }
        return localFile.getAbsolutePath();
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

第二步:修改你的播放器创建代码

用复制后的本地路径来创建播放器,替换原来的直接asset文件名:

AudioMedia play_dev_med = MyApp.ep.audDevManager().getPlaybackDevMedia();
AudioMediaPlayer player = new AudioMediaPlayer();

// 先复制文件到本地
String localWavPath = copyAssetToLocal(MyApp.getContext(), "audio_cutter.wav");
if (localWavPath == null) {
    // 处理文件复制失败的情况,比如弹个提示
    return;
}

try {
    // 用本地路径创建播放器
    player.createPlayer(localWavPath);
    AudioMedia amp = AudioMedia.typecastFromMedia(player);
    
    // 别忘了把播放器绑定到播放设备,否则听不到声音
    amp.startTransmit(play_dev_med);
} catch (Exception e) {
    e.printStackTrace();
}

额外排查点

如果还是报错,检查这几个地方:

  • WAV文件格式是否合规:PJSIP只支持未压缩的PCM格式WAV(比如16位深度、采样率8kHz/16kHz、单声道/立体声),如果你的WAV是压缩格式(比如MP3编码的WAV),PJSIP会识别不了,用音频工具转成标准PCM WAV试试。
  • 文件名拼写是否完全一致:Android的asset目录是区分大小写的,代码里的文件名要和asset里的完全匹配(比如Audio_Cutter.wavaudio_cutter.wav是两个不同的文件)。
  • 权限问题:如果你尝试用外部存储路径,要确保应用已经申请了读取外部存储的权限(不过用内部存储的话不需要额外权限)。

内容的提问来源于stack exchange,提问作者Rudraksh Shukla

火山引擎 最新活动