【问题标题】:Stream an audio .pls in android在android中流式传输音频.pls
【发布时间】:2011-02-09 11:36:12
【问题描述】:

我正在制作一个类似收音机的应用程序,它使用流媒体。在这里,我需要从链接 (http://somedomain/some.pls) 流式传输音频。

我创建了MediaPlayer 并且知道如何从音频文件中播放。但不知道如何从网络流式传输。

编辑: 我使用以下代码时得到的logcat

MediaPlayer mp = new MediaPlayer();  
mp.setDataSource(http://somedomain/some.pls);
mp.prepare();
mp.start()

通过日志标签**MediaPlayer**

  02-15 05:50:11.761: VERBOSE/MediaPlayer(23715): constructor
    02-15 05:50:11.761: VERBOSE/MediaPlayer(23715): setListener
    02-15 05:50:11.761: INFO/MediaPlayer(23715): uri is:http://some:444/sdfd.pls
    02-15 05:50:11.761: INFO/MediaPlayer(23715): path is null
    02-15 05:50:11.761: DEBUG/MediaPlayer(23715): Couldn't open file on client side, trying server side
    02-15 05:50:11.765: VERBOSE/MediaPlayer(23715): setDataSource(http://some:444/sdfd.pls)
    02-15 05:50:11.777: VERBOSE/MediaPlayer(23715): prepare
    02-15 05:50:13.105: ERROR/MediaPlayer(23715): message received msg=3, ext1=0, ext2=0
    02-15 05:50:13.105: VERBOSE/MediaPlayer(23715): buffering 0
    02-15 05:50:13.105: ERROR/MediaPlayer(23715): callback application
    02-15 05:50:13.105: ERROR/MediaPlayer(23715): back from callback

通过日志标签**PlayerDriver**

02-15 05:50:11.765: VERBOSE/PlayerDriver(2393): constructor
02-15 05:50:11.765: VERBOSE/PlayerDriver(2393): OpenCore hardware module not found
02-15 05:50:11.765: VERBOSE/PlayerDriver(2393): start player thread
02-15 05:50:11.765: VERBOSE/PlayerDriver(2393): startPlayerThread
02-15 05:50:11.769: VERBOSE/PlayerDriver(2393): InitializeForThread
02-15 05:50:11.769: VERBOSE/PlayerDriver(2393): OMX_MasterInit
02-15 05:50:11.769: VERBOSE/PlayerDriver(2393): OsclScheduler::Init
02-15 05:50:11.769: VERBOSE/PlayerDriver(2393): CreatePlayer
02-15 05:50:11.777: VERBOSE/PlayerDriver(2393): AddToScheduler
02-15 05:50:11.777: VERBOSE/PlayerDriver(2393): PendForExec
02-15 05:50:11.777: VERBOSE/PlayerDriver(2393): OsclActiveScheduler::Current
02-15 05:50:11.777: VERBOSE/PlayerDriver(2393): StartScheduler
02-15 05:50:11.777: VERBOSE/PlayerDriver(2393): Send player code: 2
02-15 05:50:11.777: VERBOSE/PlayerDriver(2393): CommandCompleted
02-15 05:50:11.777: VERBOSE/PlayerDriver(2393): Completed command PLAYER_SETUP status=1
02-15 05:50:11.777: INFO/PlayerDriver(2393): PlayerDriver::isProtectedFile(http://some:444/sdfd.pls)
02-15 05:50:11.777: VERBOSE/PlayerDriver(2393): File EXT is : .pls
02-15 05:50:11.777: ERROR/PlayerDriver(2393): PlayerDriver::it is a not Protected file
02-15 05:50:11.781: VERBOSE/PlayerDriver(2393): Send player code: 3
02-15 05:50:11.781: VERBOSE/PlayerDriver(2393): handleSetDataSource
02-15 05:50:11.781: VERBOSE/PlayerDriver(2393): handleSetDataSource- scanning for extension
02-15 05:50:11.800: VERBOSE/PlayerDriver(2393): CommandCompleted
02-15 05:50:11.800: VERBOSE/PlayerDriver(2393): Completed command PLAYER_SET_DATA_SOURCE status=1
02-15 05:50:11.800: VERBOSE/PlayerDriver(2393): Send player code: 6
02-15 05:50:11.800: VERBOSE/PlayerDriver(2393): release string is 2.2 len 3
02-15 05:50:13.101: VERBOSE/PlayerDriver(2393): HandleInformationalEvent: 34
02-15 05:50:13.101: VERBOSE/PlayerDriver(2393): HandleInformationalEvent: 19
02-15 05:50:13.124: VERBOSE/PlayerDriver(2393): HandleInformationalEvent: 20
02-15 05:50:14.511: VERBOSE/PlayerDriver(2393): HandleInformationalEvent: 20
02-15 05:50:16.509: VERBOSE/PlayerDriver(2393): HandleInformationalEvent: 20

这个02-15 05:50:16.509: VERBOSE/PlayerDriver(2393): HandleInformationalEvent: 20 循环但没有声音..
可能出了什么问题..
谢谢。

【问题讨论】:

  • 你知道怎么做吗?

标签: android streaming media-player


【解决方案1】:


您可以使用 MediaPlayer 类提供的文件流功能来执行上述操作。
我还没有测试过下面的代码,但它应该是以下几行:

MediaPlayer mp = new MediaPlayer();  
mp.setDataSource(http://somedomain/some.pls);
mp.prepare();
mp.start();  

但请记住执行以下操作:
1. 用trycatch 语句将上述每个语句括起来,并大量打印到LogCat。这将有助于轻松调试。
2. 完成后释放资源。

HTH,
斯里拉姆

【讨论】:

  • 它不工作。不产生任何声音:(。既没有错误也没有异常。
  • @Jithin:你在 logcat 上收到了什么消息?
  • @Jithin:几点:1.你在哪里解析这个pls文件?据我所知,可能需要解析 pls 文件才能在 Android 上播放。你可以在这里发布pls文件吗? 2.确保pls文件不受保护。
  • 天哪。我不知道。您能否为我提供解析 pls 文件的链接或教程。我如何检查它是否受到保护?如果受到保护,我需要做什么?
  • 你能把那个pls文件贴在这里吗?要查看 pls 格式,请看这里:en.wikipedia.org/wiki/PLS_%28file_format%29。 iPhone似乎可以直接播放这些文件,但是我看到不少关于在an​​droid上播放pls文件的问题。
【解决方案2】:

来自 android 的 Mediaplayer api 支持流式传输 .pls 文件,但该 API 不是最佳选择,文档也不好。官方文档中给出的生命周期图提供了有价值的信息,但乍一看可能会令人困惑。

示例代码sn-p:

MediaPlayer mp;
mp=MediaPlayer.create(getApplicationContext(),Uri.parse(url))
Example url of  .pls file http://50.xx.xxx.xx:xx40/)

mp.start();
mp.pause();
mp.release() (or mp.reset() as applicable)

http://developer.android.com/reference/android/media/MediaPlayer.html#create(android.content.Context, android.net.Uri)

MediaPlayer api 提供了侦听器/回调,但对于从事音频流式传输的应用程序开发人员来说,这确实是个问题。

在代码 sn-p 中使用的静态构造函数是建议/更好的方法来创建带有 URI 的媒体对象(例如带有主机和端口的 http url。) 但是回调函数不能被开发者使用,因为prepare是由构造函数自己调用的。

创建的对象可以在异步线程(AsyncTask api)中播放/停止。

android 官方文档没有给出任何获取媒体播放器状态的“get 方法”。

我欢迎安卓应用开发者谈论这个;

我希望框架开发人员提供更准确的文档 - 它支持多少,或者 Google Inc 和 Android 框架开发团队对带有 url 的音频流媒体播放器 API 的重要性和愿景。

如果有人需要我的帮助或分享他们的经验,请在 MediaPlayer api 上讨论音频流 @http://stackoverflow.com 或 Android 开发者博客 (android-developers.blogspot.com)。

问候 斯里·罗摩克里希纳 项目经理和 Android 开发人员 @ New Mek Solutions,海得拉巴。

【讨论】:

    【解决方案3】:

    伙计,试试这两个东西:

    1:代码

    mediaPlayer = MediaPlayer.create(this, Uri.parse("http://vprbbc.streamguys.net:80/vprbbc24.mp3"));
    mediaPlayer.start();
    

    2:.pls 文件

    此 URL 来自 BBC,仅作为示例。这是我在 linux 上下载的 .pls 文件

    wget http://foo.bar/file.pls
    

    然后我用 vim 打开(使用你最喜欢的编辑器;),我看到了这个文件中的真实 URL。不幸的是,并非所有的 .pls 都是这样的纯文本。

    玩得开心!

    【讨论】:

      【解决方案4】:

      您可以尝试下载 pls 文件,解析其中的 url,然后将它们放入 MediaPlayer。

      【讨论】:

      • 感谢您的重播。但是我们如何下载“.pls”文件。它是实时流媒体。数据直接来自网络
      • 嗯,没有。阅读"Playing from a File or Stream"
      猜你喜欢
      • 2012-01-06
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多