1. 程式人生 > >Android網路電臺的一種實現方案

Android網路電臺的一種實現方案

隨著電子產品的飛速發展,廣播電臺幾乎已經遠離了人們的娛樂生活,但是近年來由於網路電臺的興起,廣播電臺又逐漸有了市場,手機上如果有一個網路電臺軟體,使用率應該是比較高的。目前的主流智慧手機平臺中,iphone和symbian都已經有了這類軟體,android平臺雖然推出的時間不是很長,但是也已經有這類軟體了,最近我也正在Android上做這方面的工作,下面就把我的一些經驗介紹一下。

網路電臺種類

目前的網路電臺網站一般是基於以下三種協議的:

mms、rtsp、http

其中mms是微軟公司提出的網路流媒體協議,通常採用wma格式的檔案,Android現在還不支援這種協議,也不支援wma格式,原因比較明顯,競爭對手嘛。

rtsp是RealNetworks公司提出的,Android是支援這種協議的,但是這種協議通常採用rm格式的檔案,Android是不支援的。

http協議Android是肯定支援的,而且這種協議一般採用mp3的檔案格式,Android也支援。

綜上,我們要在Android上開發網路電臺軟體,那麼只能選擇http協議mp3格式的網路電臺網站,這樣的網站主要包括shoutcast和icecast兩大類。這兩類有微小差別,基本上是相同的,下面主要以shoutcast為主進行說明。

MediaPlayer

熟悉Android的人可能都知道有MediaPlayer這樣一個類,用於媒體播放,而且這個類是支援流媒體播放的,這個類支援的協議包括rtsp、http等,但是我們還不能直接用這個類來播放網路電臺,主要有兩個原因:

1.上面提到的shoutcast電臺並不是直接採用http協議,MediaPlayer無法正常連線到shoutcast電臺

的形式,也就是說url中必須包括檔名,shoutcast電臺的url不符合這樣的形式.

因此需要做一些轉換的工作。

shoutcast協議

上面已經提到,shoutcast網路電臺是採用http協議的,其實這種說法並不準確,shoutcast電臺採用的是shoutcast協議,這種協議與http略有不同,客戶端與伺服器間通訊過程如下:

向伺服器傳送GET請求,內容如下:

HTTP/1.0/r/n

User-Agent:AndroidInternetRadio/r/n

Accept:audio/mpeg/r/n/r/n

伺服器端返回如下:

ICY 200 OK/r/n (signifying that the server was successful)

icy-notice1:<BR>This stream requires <ahref="http://www.winamp.com/">Winamp</a><BR> (redundant notice)

icy-notice2:SHOUTcast Distributed Network Audio Server/posix v1.x.x<BR> (tells the client what server it is and version)SHOUTcast Specific

icy-name:Unnamed Server/r/n (Name of the server)

icy-genre:Unknown Genre/r/n (what genre the server falls under)

icy-url:http://www.shoutcast.com/r/n (homepage for the server)

Content-Type:audio/mpeg/r/n (Content type of the stream to follow)

icy-pub:1/r/n (whether the server is public or not)

icy-br:56/r/n (bitrate of the server)

icy-metaint:8192/r/n (if icy-metadata:1 was signified this was shown I will discuss this further later)

/r/n (end of header)

At this point the server begins sending the audio data(從這裡開始傳送音訊資料).

可以看出ShoutCast伺服器的Reponse與通常的HTTP協議不同,因此直接以HTTP協議方式進行連線不能夠成功,需要自己寫一套對應ShoutCast協議的處理。

上面介紹了一些相關的知識,下面介紹一下軟體結構,如下圖:

internet radio

Activity           App畫面部分程式碼

SC Client        通過shoutcast協議連線網路電臺,獲取電臺音訊資料流

HTTP Server    提供http連線,將SCClient接收到的音訊資料轉發給MediaPlayer類

MediaPlayer    音訊播放類,通過訪問http://127.0.0.1/a.mp3:port 與HTTPServer建立連接獲取資料流

RadioServer    網路電臺伺服器

在Android上開發網路收音機,核心部分在於將shoutcast協議的資料流轉換為MediaPlayer類可播放的形式,也就是上圖中的SCClient和HTTPServer,本文只是介紹了大體實現方案,具體編碼中還會有一些細節問題(例如MediaPlayer連線HTTPServer時,需要有一個contentlenth,這個值應該指定為無窮大)需要解決。

相關推薦

Android網路電臺實現方案

隨著電子產品的飛速發展,廣播電臺幾乎已經遠離了人們的娛樂生活,但是近年來由於網路電臺的興起,廣播電臺又逐漸有了市場,手機上如果有一個網路電臺軟體,使用率應該是比較高的。目前的主流智慧手機平臺中,iph

Creator填色遊戲的實現方案

# 前言 先上一個辛苦弄出來的gif效果。寫公眾號時間不長,很多技巧還在慢慢跟小夥伴學習。可關注公眾號,回覆“繪圖”或者“填色”都可獲得demo的git地址。請使用Creator2.4.0執行 ![fillcolor.gif](https://img2020.cnblogs.com/other/330473/

物聯網應用中的數字孿生——實現物聯網數字孿生的全面的解決方案

原文連結:http://www.oracle.com/us/solutions/inter...twins-for-iot-apps-wp-3491953.pdf 轉載於:https://blog.csdn.net/steelren/article/details/79198165 簡介

關於quartz定時任務實現Job介面無法註解為spring bean 的解決方案

  通常情況下,我們使用quartz之後,定時任務實現Job介面,並重寫execute()方法: public class QuartzJob1 implements Job { /** * quartz回撥此介面,此介面中為定時任務具體執行內容 *

Android嚮導框架(Wizard framework)的實現(需要原始碼的同學請留言)

做介面開發的兄弟姐妹都知道嚮導框架一般GUI庫都有提供,而android的介面庫中,卻沒有嚮導框架這個東東。 不要驚訝,你要是不相信的話可以到谷歌查詢,我在stackoverflow看到一些提問:如何實現嚮導式的互動,在android中:how to implement a wizard like

Android之動態修改system/etc目錄下檔案的實現方式-SELinux

在沒有root的前提下,system分割槽為只讀,若要動態修改該分割槽下的檔案,可以按照下面流程實現: 1.寫執行指令碼,這裡以修改system/etc/hosts檔案為例,在/device/mediatek/mt67xx目錄下建立名為modifyhosts.sh的檔案,檔

實現非阻塞網路通訊的方法———使用libev

背景:最近終於開始了我的實習生之路,本來在進公司之前還比較緊張,儘管拿到了offer,因為畢竟這是一個新的起點,一開始從學生到員工這個身份的轉變讓我有些不太適應,但是還好在公司裡遇到了人超級好的軟體經理Alex以及其他精明能幹的小夥伴們,所以這個過渡時間也很快。 一開始Al

MacBook升級到OSX 10.13 下執行Android Simulator失敗的解決方案

作者:天涯來客:iOS_Android 開發專案技術服務 一、背     景 MacBook配置如下:      之前的OSX版本為 10.6,Android studio在此版本下Emulator執行正常。      由於目前OSX版本已升級為10.13

基於 android 資料備份恢復的實現

引言 隨著 3G 時代的到來,移動網際網路的發展,手機的功能越來越強大,手機裡的資料對每個使用者來說都非常的重要,特別是通訊錄、日程、簡訊息、郵件等資料,一旦手機丟失、誤刪或其他意外使得資料無法正常使用,會給使用者帶來麻煩,資料備份與恢復這個應用可以幫助使用者解決這個問題。

Android輪訓機制以及API19之後定時不準的解決方案

在專案的進展中,使用到了定時輪訓機制,參考網上的一個例子,稍加修改後可以使用,但是發現在5.x的系統上有定時不準的問題, 網上說從API19開始,alarm的機制都是非準確傳遞的,所以如果還是使用了setRepeating()方法,將會出現定時不準,但是如果強行 想用的話也

Android studio 出現java.lang.NoClassDefFoundError錯誤的解決方案 5.0以下機型無法執行應用報錯

在重構中,添加了一些第三方類庫,使得整個Android程式的方法數超出了65535,這個時候打包時應該出現下面這個錯誤 Process: com.youzhiapp.cityonhand, PID: 13155 java.lang.NoClassDefFoundError:

Android Studio中使用自定義Android.jar缺少方法的解決方案

最近在Android Studio專案中ListView的scrollListBy方法,這個方法在SDK 19及其以上版本才有的,而專案使用的自定義Android.jar中的ListView並不包含這個方法。 如果為了使用這個方法,而重新編譯Android.jar,代價太大

C++差分隱私的指數機制的實現方法

list and span 機制 namespace stdio.h int class ++ #include <iostream> #include<stdio.h> #include<stdlib.h> #include<m

nginx 301重定向實現方法

pan listen lis return uri www com 瀏覽器 request 1 假設要使用的域名是b.com,以前的老域名是a.com,則以下設置讓nginx把a.com的請求訪問轉發到b.com,並返回301給瀏覽器。 2 server 3

Python3中socket的實現方式

div reply auth email str 兩個 env ini 字符串 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017-06-09 22:57 # @Author : wlgo210

樂觀鎖的實現方式——CAS

www. 提升 中一 num 對象 用戶 ace 另一個 nbsp 原文出處: hollischuang (@Hollis_Chuang) 在深入理解樂觀鎖與悲觀鎖一文中我們介紹過鎖。本文在這篇文章的基礎上,深入分析一下樂觀鎖的實現機制,介紹什麽是CAS、CAS的應用以及C

最大子矩陣的實現方法

targe 空間 pos 右下角 ont 算法 algo 最大子矩陣 AC 題目: 農夫約翰想要在他的正方形農場上建造一座正方形大牛棚。他討厭在他的農場中砍樹,想找一個能夠讓他在空曠無樹的地方修建牛棚的地方。我們假定,他的農場劃分成 N x N 的方格。輸入數據中包括

Java模版方法的另實現

pan strategy 全部 相關 必須 rod () 抽象方法 rate   面試荔枝FM杯具,遂死磕AQS途中發現一個有趣的模版用法,記下來。   模版方法是很重要的設計模式,在數據訪問層、眾多的插件接口都可見其影子,一般的實現都是在模版中定義抽象方法並使用其方法進行

Java並發問題--樂觀鎖與悲觀鎖以及樂觀鎖的實現方式-CAS

RF -- 指針 locking water 更多 錯誤 創建 判斷 首先介紹一些樂觀鎖與悲觀鎖: 悲觀鎖:總是假設最壞的情況,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖。傳統的關系型數據庫裏邊就用到了很多這

比例諧振控制的實現

ID 這樣的 perf fig 適應性 ont tro 特定 結構 原文地址:https://donghao2nanjing.github.io/2018/06/22/PR_Controller/ 1. 比例諧振控制器簡介 首先,我們來看看比例諧振控制器的傳遞函數和伯德圖: