创建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.wav和audio_cutter.wav是两个不同的文件)。 - 权限问题:如果你尝试用外部存储路径,要确保应用已经申请了读取外部存储的权限(不过用内部存储的话不需要额外权限)。
内容的提问来源于stack exchange,提问作者Rudraksh Shukla




