【问题标题】:Stream and Play .m4a stream (Itunes preview Url) in android在 android 中流式传输和播放 .m4a 流(iTunes 预览网址)
【发布时间】:2012-07-16 07:11:41
【问题描述】:

我想流式传输和播放 iTunes 预览网址,例如 http://a2.mzstatic.com/us/r1000/044/Music/e9/40/ec/mzm.evyxvimp.aac.p.m4a。我尝试使用AAC Decoder Android 库。通过它我可以流式传输和播放 AAC 流 url,例如 http://http.yourmuze.com:8000/play/paradise/l.aac。但它不支持 m4a url(Logcat 说 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 显示无法打开网址。
  2. 我尝试使用Vitamio SDK 也无法播放itunes preview Urls

itunes preview urls可以在android上玩吗?

【问题讨论】:

  • 什么是MultiPlayer?您是否尝试过将 URL 传递给 Android 的默认 MediaPlayer 实例?
  • 我试过了,但安卓默认媒体播放器无法流式传输 aac 流 url。所以我尝试使用使用 MultiPlayer 而不是 MediaPlayer 的 AAC 解码器库。但它也不是流媒体。
  • 我是ServeStream的开发者。我尝试了您提供的 URL,它使用最新版本 (0.4.11) 播放没有问题,仅供参考。 ServeStream 将满足您的要求。
  • @WilliamSeemann 我用最新版本(0.4.11)尝试了这个网址a2.mzstatic.com/us/r1000/044/Music/e9/40/ec/…,它显示该网址无法打开。
  • 刚刚在运行 API 15 的模拟器中试了一下,效果很好。也许您的设备不支持这种格式?

标签: android stream media-player itunes aac


【解决方案1】:

它与媒体格式等无关。Apple 只是阻止非 Apple 客户访问预览。您可以欺骗 User-Agent 标头并访问预览。

在此处阅读我的相关博文:http://ahmetalpbalkan.com/blog/how-to-bypass-itunes-music-previews-protection/ 这就是为什么您在 Android 上播放音乐时会得到 404。这应该可以回答您的问题。

【讨论】:

  • 我也这么认为...是否只有区域限制?请参阅 William Seemann 的评论...但是使用 ServeStream 它对我从来没有用过。我从印度的不同设备和模拟器上对其进行了测试。
【解决方案2】:

Android 支持 M4A 和 AAC。我建议阅读此页面:http://developer.android.com/guide/appendix/media-formats.html

您应该注意的几件事 a) 较旧的设备可能没有特定的编码或格式支持(特别是,如果您低于 OS 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。
  • 您是否授予访问互联网的权限?我认为问题在于它无法访问它(相对于它无法播放)
  • 您是在模拟器上还是在设备上尝试过?我建议在主要制造商的一些最新设备上试用它。正如我写的那样,我看到旧设备上的媒体存在许多不同的问题,并且模拟器在播放媒体文件时(可能仍然存在)问题。
  • 您的另一个想法(长镜头)是编译 Android 源代码 (source.android.com),将 Logs 添加到您正在使用的 MediaPlayer 方法中以查看它返回 FileNoFoundException 的原因。
  • 我尝试了 nexus 并无视。感谢您的新方法。我会调查它并在稍后通知你会发生什么。
【解决方案3】:

看看ServeStream

适用于 Android 的 HTTP 媒体服务器浏览器和流播放器。

特点:

  • 支持Android 2.2+、3.0+(不支持
  • 播放 Android 支持的媒体文件
  • 额外支持 m3u、m3u8、pls 和 asx 播放列表
  • 支持多任务处理/在后台播放音频
  • 重复和随机播放模式
  • 闹钟支持
  • 主屏幕小部件
  • 利用 HTML 解析来导航为 HTML 页面提供服务的 HTTP 媒体服务器

【讨论】:

  • 感谢您的回复,我试用了该应用程序。它还显示无法打开网址...
  • 我是ServeStream的开发者。我尝试了您提供的 URL,它使用最新版本 (0.4.11) 播放没有问题,仅供参考。 ServeStream 将满足您的要求。
猜你喜欢
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
相关资源
最近更新 更多