在安卓设备上播放.m4a流媒体(iTunes预览URL):流媒体与播放

12

我想要像http://a2.mzstatic.com/us/r1000/044/Music/e9/40/ec/mzm.evyxvimp.aac.p.m4a这样的iTunes预览链接进行流式传输和播放。我尝试使用AAC 解码 Android库,通过该库可以流式传输和播放类似http://http.yourmuze.com:8000/play/paradise/l.aac这样的 AAC 流链接。但它无法流式传输 .m4a 链接(日志中显示 java.io.FileNotFoundException: http://a2.mzstatic.com/us/r1000/044/Music/e9/40/ec/mzm.evyxvimp.aac.p.m4a)。

我该如何流式传输这些 .m4a 链接?

我的代码:

public class AACPlayerActivity extends Activity implements OnClickListener,PlayerCallback{

private Button btnPlay;
private ProgressBar progress;
private Handler uiHandler;

private MultiPlayer multiPlayer;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    btnPlay = (Button)findViewById(R.id.playButton);
    progress = (ProgressBar)findViewById(R.id.progress);
    progress.setVisibility(View.INVISIBLE);

    btnPlay.setOnClickListener(this);

    uiHandler = new Handler();
}

public void playerException(Throwable arg0) {
    // TODO Auto-generated method stub

}

public void playerMetadata(String arg0, String arg1) {
    // TODO Auto-generated method stub

}

public void playerPCMFeedBuffer(boolean arg0, final int audioBufferSizeMs, final int audioBufferCapacityMs) {
    // TODO Auto-generated method stub
    uiHandler.post(new Runnable() {

        public void run() {
            // TODO Auto-generated method stub
             progress.setProgress( audioBufferSizeMs * progress.getMax() / audioBufferCapacityMs );
        }
    });
}

public void playerStarted() {

    uiHandler.post(new Runnable() {

        public void run() {
            // TODO Auto-generated method stub
            progress.setProgress( 0 );
            progress.setVisibility( View.VISIBLE );
        }
    });

}

public void playerStopped(int arg0) {
    // TODO Auto-generated method stub
    uiHandler.post(new Runnable() {

        public void run() {
            // TODO Auto-generated method stub
            progress.setVisibility( View.INVISIBLE );
        }
    });

}

public void onClick(View v) {
    // TODO Auto-generated method stub
    if(btnPlay.getText().equals("Play")){
        start();
        btnPlay.setText("stop");
    }else{
        stop();
    }
}


 private void start() {
        stop();
        // we cannot do it in playerStarted() - it is too late:
        multiPlayer = new MultiPlayer(this,MultiPlayer.DEFAULT_AUDIO_BUFFER_CAPACITY_MS, MultiPlayer.DEFAULT_DECODE_BUFFER_CAPACITY_MS);
        multiPlayer.playAsync("http://a2.mzstatic.com/us/r1000/044/Music/e9/40/ec/mzm.evyxvimp.aac.p.m4a");
    }


    private void stop() {
        if (multiPlayer != null) {
            multiPlayer.stop();
            multiPlayer = null;
        }
    }

更新

  1. 我尝试使用ServeStream,但它显示无法打开该URL。
  2. 我尝试使用Vitamio SDK,但它也无法播放预览链接(iTunes preview urls)。

在Android上是否有可能播放预览链接(iTunes preview urls)?


什么是“多人游戏”?你尝试过只是将URL传递给Android默认的“MediaPlayer”实例吗? - devunwired
我尝试过了,但 Android 默认的媒体播放器无法流式传输 AAC 流 URL。因此,我尝试使用 AAC 解码库,该库使用 MultiPlayer 而非 MediaPlayer。但它也无法流式传输。 - Stack User 5674
我是ServeStream的开发者。我尝试了您提供的URL,并且使用最新版本(0.4.11)播放没有任何问题,供您参考。 ServeStream将满足您的要求。 - William Seemann
@WilliamSeemann 我尝试在此网址http://a2.mzstatic.com/us/r1000/044/Music/e9/40/ec/mzm.evyxvimp.aac.p.m4a上使用最新版本(0.4.11),但它显示无法打开该网址。 - Stack User 5674
刚在运行API 15的模拟器中尝试了一下,完美地运行了。也许你的设备不支持这种格式? - William Seemann
3个回答

5
请看 ServeStream

HTTP媒体服务器浏览器和安卓流媒体播放器。

特点:

  • 支持安卓2.2+,3.0+(不支持低于2.2版本)
  • 播放安卓支持的媒体文件
  • 额外支持m3u、m3u8、pls和asx播放列表
  • 支持多任务/后台音频播放
  • 循环和随机播放模式
  • 闹钟功能
  • 桌面小部件
  • 利用HTML解析允许导航HTTP媒体服务器提供的HTML页面

谢谢您的回复,我尝试了这个应用程序。它还显示无法打开URL... - Stack User 5674
1
我是ServeStream的开发者。我试过了你提供的URL,使用最新版本(0.4.11)播放没有任何问题,供参考。ServeStream可以满足你的需求。 - William Seemann

4
M4A和AAC格式在Android系统中被支持。建议您阅读此页面:http://developer.android.com/guide/appendix/media-formats.html
但需要注意以下几点: a) 旧设备可能不支持某些编码或格式(特别是系统版本低于2.2的设备); b) 一些廉价中国制造的设备可能在音频/视频堆栈中集成了一些奇怪的东西。
因此,您可以尝试使用MediaPlayer API播放它: http://developer.android.com/reference/android/media/MediaPlayer.html 您可以查看这个示例: http://blog.endpoint.com/2011/03/api-gaps-android-mediaplayer-example.html

我也尝试过这个。但不是流式的。我得到了一个java.io.FileNotFoundException。 - Stack User 5674
你是否授权访问互联网?我认为问题在于它无法访问互联网(而不是无法播放)。 - Victor Ronin
你是在模拟器上试过还是在设备上尝试了一下?我建议你试试来自主要厂商的最新设备。正如我所写的那样,在旧设备上可能会看到很多不同的媒体问题,模拟器也会有(可能仍然存在)播放媒体文件的问题。 - Victor Ronin
你(很小的希望)另一个想法是编译Android源代码(http://source.android.com/),在你使用的MediaPlayer方法中添加Logs,以查看为什么它返回FileNotFound异常。 - Victor Ronin
我在Nexus S和Defy上尝试了一下。感谢新的方法。我会研究一下并稍后告诉你结果。 - Stack User 5674

0

我也这么认为...有地区限制吗?看看William Seemann的评论...但是使用ServeStream对我从印度的不同设备和模拟器进行测试时从未起作用。 - Stack User 5674

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接