求教,是否直接可以调用android的libmedia.so库进行音频播放

dengxuguang 2013-07-18 07:03:07
问题: 在C++代码中是否可以调用android系统的libmedia.so, 我用C++写了一个测试程序,调用了libmedia.so中mediaplayer.cpp中的方法进行音频播放,可以通过编译,也可以在android系统的机顶盒中执行,但是prepare()方法一直被阻塞,求大神指点该如何解决啊,给点思路好吗?以下是测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <mediaplayer.h>

using namespace android;

int main()
{
int iRet = 0;
MediaPlayer *p= new MediaPlayer();

iRet = p->setDataSource("/data/j2me/phoneme-cache/061075.midi", NULL);
if (0 != iRet)
{
printf("[setDataSource] iRet = %d\n", iRet);
}

iRet = p->setAudioStreamType(3);
if (0 != iRet)
{
printf("[setAudioStreamType] iRet = %d\n", iRet);
}

iRet = p->prepare();
if (0 != iRet)
{
printf("[prepare] iRet = %d\n", iRet);
}

iRet = p->start();
if (0 != iRet)
{
printf("[start] iRet = %d\n", iRet);
}

p->stop();
return 0;
}
...全文
771 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuie0000 2015-08-27
  • 打赏
  • 举报
回复
引用 20 楼 xuie0000 的回复:
08-27 15:15:41.484 I/UrlCheck( 107): isUrlRealM3U8 in, ptr: 0x417e0780, url: /mnt/sdcard/abc.mp3 08-27 15:15:41.484 I/UrlCheck( 107): UrlCheckHelper ptr: 0x417e0780, url_type: 0 08-27 15:15:41.594 I/ChromiumHTTPDataSourceSupport( 107): Request failed with status 4 and os_error -300 08-27 15:15:41.594 E/AwesomePlayer( 107): connect fail to url: /mnt/sdcard/abc.mp3 08-27 15:15:41.594 I/UrlCheck( 107): url checked, reallyM3U8: 0 楼主,你好,我现在也在打算用Android底层MediaPlay,在iRet = p->setDataSource("/mnt/sdcard/abc.mp3", NULL);时就报我错。能回答我,是什么原因吗?谢谢 - 歌曲我已经放在相应目录
我将 iRet = p->setAudioStreamType(3);注释掉,可以播放歌曲
xuie0000 2015-08-27
  • 打赏
  • 举报
回复
08-27 15:15:41.484 I/UrlCheck( 107): isUrlRealM3U8 in, ptr: 0x417e0780, url: /mnt/sdcard/abc.mp3 08-27 15:15:41.484 I/UrlCheck( 107): UrlCheckHelper ptr: 0x417e0780, url_type: 0 08-27 15:15:41.594 I/ChromiumHTTPDataSourceSupport( 107): Request failed with status 4 and os_error -300 08-27 15:15:41.594 E/AwesomePlayer( 107): connect fail to url: /mnt/sdcard/abc.mp3 08-27 15:15:41.594 I/UrlCheck( 107): url checked, reallyM3U8: 0 楼主,你好,我现在也在打算用Android底层MediaPlay,在iRet = p->setDataSource("/mnt/sdcard/abc.mp3", NULL);时就报我错。能回答我,是什么原因吗?谢谢 - 歌曲我已经放在相应目录
lishukui54430 2014-10-15
  • 打赏
  • 举报
回复
请问楼主的cpp 是什么平台编译的?能详细说明下吗,我也想做直接调用libmedia.so库的Java程序,使用jni技术。
kj654 2014-09-05
  • 打赏
  • 举报
回复
using namespace android; android报红??
chengj123456789 2014-09-02
  • 打赏
  • 举报
回复
很不错啊,顶一下你哦
dengxuguang 2013-07-25
  • 打赏
  • 举报
回复
问题已经解决,原因在于调用完prepare()后主线程被阻塞,没有线程去读去libmediaplayerservice.so传过来的回调消息,在开始的地方加上ProcessState::self()->startThreadpool()就可以了,还是对binder理解不够深刻啊,借这次机会深入研究下binder.
dengxuguang 2013-07-24
  • 打赏
  • 举报
回复
引用 14 楼 river80 的回复:
没有人为你义务解决问题。
你说的对,别人的确没有义务为我解决问题,但是技术本来就是要交流的,但是如果大家都对别人的问题冷漠对待,那么或许当有一天你也遇到问题,你去请教谁呢?
river80 2013-07-24
  • 打赏
  • 举报
回复
没有人为你义务解决问题。
dengxuguang 2013-07-23
  • 打赏
  • 举报
回复
这问题很难吗?就没一个人做过这方面的东西?真心希望了解的人给点建议,你的一句话可能就使我豁然开朗,为什么向大家请教个问题,这么少人回答,搞不懂是CSDN越来越不行了,还是人们越来越冷漠了
dengxuguang 2013-07-23
  • 打赏
  • 举报
回复
求大神指点,实在是找不到资料了。
dengxuguang 2013-07-22
  • 打赏
  • 举报
回复
求指点。。。。。。。。
dengxuguang 2013-07-22
  • 打赏
  • 举报
回复
直接调用libmediaplayer.so的接口不行,这个库是以service的形式对外提供服务的,它的构造函数是private的,所以没办法直接调用。 又回到了原来的问题上,调用libmedia.so与libmediaplayer.so进行通信,libmedia.so远程调用libmediaplayer.so没有问题,libmediaplayer.so也正确执行了,但是在libmediaplayer.so远程调用libmedia.so的notify接口时却出现问题, 求大神给点思路
dengxuguang 2013-07-22
  • 打赏
  • 举报
回复
求大神指点,给个方向吧
dengxuguang 2013-07-19
  • 打赏
  • 举报
回复
引用 6 楼 guoyoulei520 的回复:
[quote=引用 5 楼 dengxuguang 的回复:] [quote=引用 4 楼 guoyoulei520 的回复:] [quote=引用 3 楼 dengxuguang 的回复:] [quote=引用 2 楼 guoyoulei520 的回复:] [quote=引用 1 楼 dengxuguang 的回复:] 求来人指点啊, 纠结好几天了,再不解决就要崩溃了。。。。。
你看下android源码中libmedia的调用流程。。。[/quote] 看了,流程从上到下是MediaPlayer--->libmedia_jni.so---->libmedia.so------->libmediaplayerserver.so------>ALSA库。 音频播放流程就是 setDatasource()\prepare()\start()....... 但直接通过so库调用就是有问题 求指点[/quote] java层播放媒体的代码也有setDatasource. prepare.其对应 的流程你也看过了吧.... 是不是权限或其它的问题?看下prepare函数,什么情况下会阻塞 啊[/quote] 开log跟了下流程,libmedia.so 是通过binder和libmediaplayer.so进行通信的, libmediaplayer.so在系统中是以/system/bin/mediaserver这个service来提供服务的,libmediaplayer.so接到libmedia.so(也就是我的测试程序进程)的执行prepare()的请求后,确实执行了prepare(),而且通过log对比发现执行结果也是正确的,而阻塞的真正原因在于libmediaplayer.so执行完prepare()后通过binder将结果回传给测试程序时失败,导致测试程序一直阻塞,现在的问题是搞不清为什么回调会失败,以前从没搞过android, 对音频架构中的IBinder机制完全不明白,难道又要去搞清楚IBinder机制,要疯了, 还有一种方法就是直接调用libmediaplayer.so,避过libmedia.so和libmediaplayer.so的Binder通讯,问题是我编译了一下,一大堆的编译问题,悲剧啊[/quote] 那你参考android_media_MediaPlayer.cpp吧,应该可以,里面有IPC的调用,你参考下[/quote] 这个文件看过,是JNI这一层的,它向下调用了libmedia.so, 在libmedia.so里面才通过binder和liblibmediaplayerservice.so 进行通信,我看了下通信的代码,感觉比较复杂,要弄清楚估计要花很长时间,我这边又比较急,郁闷
凉凉二点凉 2013-07-19
  • 打赏
  • 举报
回复
引用 5 楼 dengxuguang 的回复:
[quote=引用 4 楼 guoyoulei520 的回复:] [quote=引用 3 楼 dengxuguang 的回复:] [quote=引用 2 楼 guoyoulei520 的回复:] [quote=引用 1 楼 dengxuguang 的回复:] 求来人指点啊, 纠结好几天了,再不解决就要崩溃了。。。。。
你看下android源码中libmedia的调用流程。。。[/quote] 看了,流程从上到下是MediaPlayer--->libmedia_jni.so---->libmedia.so------->libmediaplayerserver.so------>ALSA库。 音频播放流程就是 setDatasource()\prepare()\start()....... 但直接通过so库调用就是有问题 求指点[/quote] java层播放媒体的代码也有setDatasource. prepare.其对应 的流程你也看过了吧.... 是不是权限或其它的问题?看下prepare函数,什么情况下会阻塞 啊[/quote] 开log跟了下流程,libmedia.so 是通过binder和libmediaplayer.so进行通信的, libmediaplayer.so在系统中是以/system/bin/mediaserver这个service来提供服务的,libmediaplayer.so接到libmedia.so(也就是我的测试程序进程)的执行prepare()的请求后,确实执行了prepare(),而且通过log对比发现执行结果也是正确的,而阻塞的真正原因在于libmediaplayer.so执行完prepare()后通过binder将结果回传给测试程序时失败,导致测试程序一直阻塞,现在的问题是搞不清为什么回调会失败,以前从没搞过android, 对音频架构中的IBinder机制完全不明白,难道又要去搞清楚IBinder机制,要疯了, 还有一种方法就是直接调用libmediaplayer.so,避过libmedia.so和libmediaplayer.so的Binder通讯,问题是我编译了一下,一大堆的编译问题,悲剧啊[/quote] 那你参考android_media_MediaPlayer.cpp吧,应该可以,里面有IPC的调用,你参考下
dengxuguang 2013-07-19
  • 打赏
  • 举报
回复
引用 4 楼 guoyoulei520 的回复:
[quote=引用 3 楼 dengxuguang 的回复:] [quote=引用 2 楼 guoyoulei520 的回复:] [quote=引用 1 楼 dengxuguang 的回复:] 求来人指点啊, 纠结好几天了,再不解决就要崩溃了。。。。。
你看下android源码中libmedia的调用流程。。。[/quote] 看了,流程从上到下是MediaPlayer--->libmedia_jni.so---->libmedia.so------->libmediaplayerserver.so------>ALSA库。 音频播放流程就是 setDatasource()\prepare()\start()....... 但直接通过so库调用就是有问题 求指点[/quote] java层播放媒体的代码也有setDatasource. prepare.其对应 的流程你也看过了吧.... 是不是权限或其它的问题?看下prepare函数,什么情况下会阻塞 啊[/quote] 开log跟了下流程,libmedia.so 是通过binder和libmediaplayer.so进行通信的, libmediaplayer.so在系统中是以/system/bin/mediaserver这个service来提供服务的,libmediaplayer.so接到libmedia.so(也就是我的测试程序进程)的执行prepare()的请求后,确实执行了prepare(),而且通过log对比发现执行结果也是正确的,而阻塞的真正原因在于libmediaplayer.so执行完prepare()后通过binder将结果回传给测试程序时失败,导致测试程序一直阻塞,现在的问题是搞不清为什么回调会失败,以前从没搞过android, 对音频架构中的IBinder机制完全不明白,难道又要去搞清楚IBinder机制,要疯了, 还有一种方法就是直接调用libmediaplayer.so,避过libmedia.so和libmediaplayer.so的Binder通讯,问题是我编译了一下,一大堆的编译问题,悲剧啊
凉凉二点凉 2013-07-19
  • 打赏
  • 举报
回复
引用 3 楼 dengxuguang 的回复:
[quote=引用 2 楼 guoyoulei520 的回复:] [quote=引用 1 楼 dengxuguang 的回复:] 求来人指点啊, 纠结好几天了,再不解决就要崩溃了。。。。。
你看下android源码中libmedia的调用流程。。。[/quote] 看了,流程从上到下是MediaPlayer--->libmedia_jni.so---->libmedia.so------->libmediaplayerserver.so------>ALSA库。 音频播放流程就是 setDatasource()\prepare()\start()....... 但直接通过so库调用就是有问题 求指点[/quote] java层播放媒体的代码也有setDatasource. prepare.其对应 的流程你也看过了吧.... 是不是权限或其它的问题?看下prepare函数,什么情况下会阻塞 啊
dengxuguang 2013-07-19
  • 打赏
  • 举报
回复
引用 2 楼 guoyoulei520 的回复:
[quote=引用 1 楼 dengxuguang 的回复:] 求来人指点啊, 纠结好几天了,再不解决就要崩溃了。。。。。
你看下android源码中libmedia的调用流程。。。[/quote] 看了,流程从上到下是MediaPlayer--->libmedia_jni.so---->libmedia.so------->libmediaplayerserver.so------>ALSA库。 音频播放流程就是 setDatasource()\prepare()\start()....... 但直接通过so库调用就是有问题 求指点
凉凉二点凉 2013-07-18
  • 打赏
  • 举报
回复
引用 1 楼 dengxuguang 的回复:
求来人指点啊, 纠结好几天了,再不解决就要崩溃了。。。。。
你看下android源码中libmedia的调用流程。。。
dengxuguang 2013-07-18
  • 打赏
  • 举报
回复
求来人指点啊, 纠结好几天了,再不解决就要崩溃了。。。。。

80,472

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧