【问题标题】:Receiving Info of a ShoutCast stream on Android在 Android 上接收 ShoutCast 流的信息
【发布时间】:2012-02-10 12:28:43
【问题描述】:

我目前正在为我的在线广播网站制作一个应用程序,我正在使用 Android 2.2 (API 8) 对其进行编码,并且我已经让 Shoutcast Stream 与两个按钮一起工作。

这是我的主课上的代码:

 public class GrooveOfMusicRadioActivity extends Activity {
      /** Called when the activity is first created. */


     MediaPlayer mediaPlayer;
     Button start, stop;



    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        start = (Button) findViewById(R.id.button1);
        stop = (Button) findViewById(R.id.button2);




        start.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                mediaPlayer.start();

            }
        });
        stop.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                mediaPlayer.pause();
            }
        });





        String url = "http://67.212.165.106:8161"; // your URL here
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

        try {
            mediaPlayer.setDataSource(url);
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            mediaPlayer.prepare();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



    }


}

所以我想知道如何接收流标题、歌曲、艺术家等并使其出现

主要的 XML 处于相对布局中

谢谢,在编程方面我是个菜鸟。

谢谢标记:)

【问题讨论】:

    标签: android metadata shoutcast


    【解决方案1】:

    您用于播放流的内容不知道(也不关心)元数据。您将不得不单独处理。

    查看这些帖子,了解您可以轻松适应 Android 的内容:

    【讨论】:

      【解决方案2】:

      我只需要自己获取元数据,我基本上做了同样的事情:Pulling Track Info From an Audio Stream Using PHP。标题中有很多数据,因此您可以使用它们,但我想要的只是流标题,所以这就是我得到的。

      Activity mainAct = this;
      public void getNowPlaying(View v) {
          Log.w("getNowPlaying", "fired");
          new Thread(new Runnable() {
              public void run() {             
                  String title = null, djName = null;
                  try {
                      URL updateURL = new URL(YOUR_STREAM_URL_HERE);
                      URLConnection conn = updateURL.openConnection();
                      conn.setRequestProperty("Icy-MetaData", "1");
                      int interval = Integer.valueOf(conn.getHeaderField("icy-metaint")); // You can get more headers if you wish. There is other useful data.
      
                      InputStream is = conn.getInputStream();
      
                      int skipped = 0;
                      while (skipped < interval) {
                          skipped += is.skip(interval - skipped);
                      }
      
                      int metadataLength = is.read() * 16;
      
                      int bytesRead = 0;
                      int offset = 0;
                      byte[] bytes = new byte[metadataLength];
      
                      while (bytesRead < metadataLength && bytesRead != -1) {
                          bytesRead = is.read(bytes, offset, metadataLength);
                          offset = bytesRead;
                      }
      
                      String metaData = new String(bytes).trim();
                      title = metaData.substring(metaData.indexOf("StreamTitle='") + 13, metaData.indexOf(" / ", metaData.indexOf("StreamTitle='"))).trim();
                      djName = metaData.substring(metaData.indexOf(" / ", metaData.indexOf("StreamTitle='")) + 3, metaData.indexOf("';", metaData.indexOf("StreamTitle='"))).trim();
                      Log.w("metadata", metaData);
                      is.close();
                  } catch (MalformedURLException e) { e.printStackTrace();
                  } catch (IOException e) { e.printStackTrace(); }
      
                  final String titleFin = title;
                  final String djNameFin = djName;
                  mainAct.runOnUiThread(new Runnable() {
                      public void run() {
                          Toast.makeText(mainAct, titleFin + "\n" + djNameFin, Toast.LENGTH_SHORT).show();
                      }
                  });
              }
          }).start();
      }
      

      【讨论】:

      • 这看起来很酷,托尼西,正是我想要的。我是 android 编程新手,但是有几个问题。 1)这段代码多久运行一次? 2)我尝试将您的代码放在我的 mainactivity 类中,该应用程序编译得很好,但是在运行时它似乎不起作用,即它没有记录任何内容或做祝酒词,(我已经包含了所有相关的导入)我需要添加清单文件中的意图过滤器使其在启动时运行此代码?还是应该自动运行?我如何从我的主要活动中调用它?对不起,我有点困惑
      • @user280109 当我写这篇文章时,我对 Android 还是很陌生,哈哈。如果您注意到,方法签名是public void getNowPlaying(View v),这会让我相信我将它绑定到xml 中的按钮上,并且在按钮上设置了android:onClick="getNowPlaying"。这样,每次您单击按钮时,它都会再次下载元数据。如果你不想使用按钮,你可以在你的 onCreate 方法(或任何地方......)中调用 getNowPlaying(null),无论如何,该方法对 View 参数没有任何作用......
      • 按照您的建议,我将其设置为在单击按钮时运行 getnowplaying 功能。但代码似乎在以下行失败: int interval = Integer.valueOf(conn.getHeaderField("icy-mettaint"));错误是 "E/AndroidRuntime(2993): java.lang.NumberFormatException: Invalid int: "null" 我尝试过各种直播流,但它们都给出了相同的错误。
      • 啊没关系,我在这里找到了一个更简单的解决方案:stackoverflow.com/a/6125139/280109
      • 虽然我也无法让该解决方案发挥作用,令人沮丧。
      猜你喜欢
      • 2015-12-13
      • 2014-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多