第五章 結論與建議
第一節 研究發現
本結主要針對串流平台、聲音格式的選擇、網頁介面設計考量以及網路環境 與手持設備的影響,提出研究與討論。
壹、 串流平台與聲音格式的選擇
串流伺服器是本系統主要的核心,市面上也有幾家串流伺服器的廠商可以選 擇,經過安裝測試,每家的串流伺服器都有提供 on demand 的串流方式,伺服器 間的主要差異在於效能與可容納的連線數量。
在測試過程中發現,每家串流伺服器因為專利關係除了軟體須額外付費,還 須使用自家的串流通訊協定,雖然一樣可以達到的跨平台的目的,但是也因此須 要多增加開發成本。也因為使用自家的串流串流通訊協定,手持設備因為產品眾 多,產品相容性也不一致,增加手持設備的不確定性。
為了確保每家手持設備都能正常使用,在本系統中網頁伺服器,因為架設容 易又具備跨平台的特性,任何設備都能瀏覽使用,又能提供免費的串流服務,效 能與其他付費的廠商也相差無幾,因此選擇以之作為核心平台。
經過研究發現,on demand 的串流方式支援常見的聲音格式如 mp3、wav、
mp4 等,但本系統的串流服務無法使用側錄系統產生的 asf 串流檔案,需經過轉 檔才能正常播放。為了節省空間與穩定性,因此選擇 mp3 作為串流檔案格式。
貳、 網頁介面設計考量
以 HTTP_USER_AGENT 自動帶出設備名稱或機型做為判斷依據,例如 APPLE 的 iphone3 手機就會自動帶入包含 iphone 關鍵文字的訊息,程式只要過濾出關鍵 字就能判斷出該帶到何種網頁,整體訊息如表 5-1。表 5-1 關鍵文字表
Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16
經過研究亦發現此方式有一缺點,因為產品不斷的推陳出新,設備帶入的訊 息也會不同,每當新產品問世就須不斷新增判斷關鍵字。有的廠商因為成本考 量,設備在設計時會省略或是沿用舊版的訊息,將會使得網頁判斷錯誤,進而導 入錯誤的頁面。為了符合新設備的畫面,也需要不斷的設計相關網頁,此一問題 也會增加日後維護成本。
參、 網路環境與手持設備的影響
第二節 結論
貳、 優點
的發展,已經相當的穩定成熟。網頁伺服器除了須付費的微軟 Windows Serverv 系列的作業系統外,一般使用開放源碼所出的網頁伺服器也能架設,例如 Linux 上的 Apache 網頁伺服器系統。系統的穩定是本系統優點之一。因為使用網頁伺 服器最為串流服務,不須另外購置其他的串流伺服器,使用者在使用本系統時不 須額外安裝播放軟體,是另一個看不到的優點。第三節 建議
跨平台網路廣播系統經過實際測次後,已能補助廣播電臺提供更多的收聽管 道,本節是對本系統及未來趨勢提出相關建議。
壹、 介面設計使用 APP
智慧型手機及平板等手持行動裝置之所以暢銷,主要還是要因為 APP 商店 的輔助。APPLE 的 APP STORE 和 Google Play 商店提供有各類軟體,裡面有上 萬種各式各樣的軟體可供選擇,因為 APP 的關係,讓手機不只是電話,演變至 今,已是人們生活上不可缺少的一部份。
本系統因為使用網頁做為使用介面,須利用 QRocde 或是在瀏覽器輸入網址 後,再將網址加到我的最愛才能找到。受限網頁架構,操作上較為單調無變化,
如果搭配設計專屬 APP,在使用介面的變化上,或是功能性就能加強,並可結合 社群軟體增加互動性。
設計專屬 APP 可以讓使用者更能快速使用本系統,也能降低使用上的錯誤,
避免因為網址輸入錯誤導致無法使用的失誤發生。
貳、 進一步建議
在現今網路社群與多媒體影音平台大多提供免費的方式,提供使用者上傳影 片與分享之用,甚至在學術界非常有名專業的 TED 論壇,也都提供免費的觀賞 平台,需要付費的內容再提供給付費 VIP 會員才能觀看。廣播在各種媒體的競 爭環境下,因為本身的特殊性,雖然不至於被淘汰,但只會越來越弱勢,尤其隨 著 4G 執照的發放,高速網路的時代來臨,將來影音內容更是容易取得與擴散。
廣播的聲音是沒有畫面的,純粹只有聲音是無法在這波潮流中生存。台東地 區網路的發展也會跟著一起改變,人民的知識水準也會跟著提高,廣播電臺不能 再用以往的經營模式獲利。沒有網路廣播系統的電臺將來生存空間會越來越小,
傳統收音機的市場不會再增加,除非電臺願意投資架設更多的發射站台,並積極 拓展市場開發新的聽眾群,否則獲利的空間只會更形壓縮。
廣播做得再好,也是需要聽眾才有價值,電臺的經營者也才能從中看到效 下載可超過 100MB,上傳可超過 50MB,速率甚至超過部分一般家庭寬頻網路。
網路頻寬變大,影音傳輸更方便,從手持行動裝置上更容易收看動態的影音媒
參考文獻
徐振華、黃宜華(2006) 。跨平台視窗程式設計-使用 Ruby 與 GTK+。電腦與通 訊雜誌,115,149。
蔡清嵐(2003)。網際網路中廣播閱聽眾電臺收播研究。圖書館學與資訊科學, 29,
,91。
黃雅琴(2004)。台灣網路電臺節目製播與廣播高等教育人才培育之關係--以銀河 網路電臺為個案研究。玄奘資訊傳播學報,1,5。
劉育佐(2012)。基於超文字串流直播協定設計和實作自適應串流媒體播放器。國 立東華大學電機工程學系碩士論文。
高榮駿(2013)。串流網路編碼之無線廣播。國立清華大學資訊工程學系碩士論文。
蔡欣怡(2007)。數位廣播發展現況分析。岩花館,1。
江典嘉(2002)。數位廣播業者經營策略分析─以中國廣播公司為例。中正大學電 訊傳播研究所碩士論文。
洪賢智,黃志立(2004)。公民營電臺數位廣播經營策略可行性初探。玄奘資訊傳 播學報,1,3。
附錄
附錄一 資料庫各欄位詳細資料一欄表
帳號密碼資料表
資料表 資料欄位 型態 長度 允許 Null 值
Account
UserName varchar 20
Password varchar 20 是 FullName varchar 20 是 Departmen varchar 50 是 ModifyPri tinyint 1
QueryPri tinyint 1
詳細節目資料表 ExpireDate smallint 2
Week smallint 2 Classname varchar 20
節目名稱資料表
資料表 資料欄位 型態 長度 允許 Null 值
Description CaseName varchar 50
Description varchar 1000 是
編碼器資料表
資料表 資料欄位 型態 長度 允許 Null 值
Encoder
EncoderNo smallint 2
EncoderName varchar 30 是 ServerType varchar 10
EncoderPort smallint 2 是 ContentDir varchar 255 是
AMFM varchar 2 是
編碼伺服器資料表
資料表 資料欄位 型態 長度 允許 Null 值
MountPoint
ServerType varchar 10
IP1 smallint 2 location varchar 255
mountpt varchar 255
memo varchar 10 是
節目排程與播放資訊資料表
資料表 資料欄位 型態 長度 允許 Null 值
Schedule
EncoderNo smallint 2 StartTime datetime 8 EndTime datetime 8
RStartTime datetime 8 是 REndTime datetime 8 是 CaseName varchar 50 是 CaseID varchar 50
LinkName varchar 255 是 location varchar 255 是 ExpireDate int 4 是 clientaccept smallint 2
MaxKBit int 4 是
ClassName varchar 20 是
AMFM varchar 2 是
Presenter varchar 50 是 DownLoad smallint 2 是
附錄二 側錄系統使用者流程
一、系統網頁:
使用者進入系統的主畫面如下圖所示。
二、選擇節目名稱:
在主畫面中可以選擇想要收聽的節目名稱,或是以節目類型、主持人做為選 擇條件,然後再依序選擇想要的播出時段,如果不選擇系統內定會以 60 天以內 的節目時段為條件,之後再點選「搜尋」以查詢節目。
三、選擇節目播放時段:
當按搜尋後再來是選擇想要收聽的時段,只要點選左側的「播放」即可線上 收聽節目。
四、播放節目:
節目播放畫面如下圖所示。
附錄三 手機版網頁主畫面程式碼
<html>
<head>
<meta http-equiv="Content-Language" content="zh-tw">
<meta http-equiv="Content-Type" content="text/html; charset=Big5">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
<meta name="APPLE-mobile-web-app-capable" content="yes">
<meta name="APPLE-mobile-web-app-status-bar-style" content="black">
<title>國立教育廣播電臺</title>
</head>
<!-- #include file="connectdb.inc" -->
<body bgcolor="#F2E4C1">
<div align="center">
<table border="1" width="280" bordercolor="#FFFFFF">
<tr align="center">
<td align="center"><img border="0"
src="images/title2.png"></td>
</tr>
'SQLstr="SELECT * FROM Schedule"
SQLstr="select distinct CaseName from Schedule where Rstarttime is not Null order by CaseName"
set rs=adocon.Execute(SQLstr)
response.write("<tr style=text-align:center>") while not rs.eof
'linkname=rs("LinkName") 'CaseID=rs("CaseID") CaseName=rs("CaseName") 'location=rs("location") 'REndTime=rs("REndTime") 'ClassName=rs("ClassName") 'Presenter=rs("Presenter") 'Response.Write vbCrLf
SQLstr1="select * from Cases where CaseName=" & "'" & CaseName &
"'"
set rs1=adocon.Execute(SQLstr1) while not rs1.eof
id=rs1("ID") rs1.movenext wend
%>
<tr style="text-align:center">
<td align="center" bgcolor="#F2E4C1"
bordercolor="#A9EC88"><a href="listen.asp?id=<% =id %>"><font size="6"><%
=CaseName %></font></td>
</tr>
<%
rs.movenext wend
'response.end
%>
<tr align="center">
<td align="center"><img border="0"
src="images/pic2.png"></td>
</tr>
</table>
</div>
</body>
</html>
附錄四 手機版網頁第二層程式碼
<html>
<head>
<meta http-equiv="Content-Language" content="zh-tw">
<meta http-equiv="Content-Type" content="text/html; charset=Big5">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
<meta name="APPLE-mobile-web-app-capable" content="yes">
<meta name="APPLE-mobile-web-app-status-bar-style" content="black">
<title>國立教育廣播電臺</title>
</head>
<!-- #include file="connectdb.inc" -->
<body bgcolor="#F2E4C1">
<div align="center">
<table border="1" width="280" bordercolor="#FFFFFF">
<tr align="center">
<td align="center"><img border="0"
src="images/title2.png"></td>
</tr>
<%
id=request("id")
SQLstr1="select * from Cases where ID='" & id & "'"
set rs1=adocon.Execute(SQLstr1) while not rs1.eof
CaseName1=rs1("CaseName") rs1.movenext
wend
SQLstr="select top 4 * from Schedule where CaseName='" & CaseName1
& "' and Rstarttime is not Null order by StartTime DESC"
set rs=adocon.Execute(SQLstr) while not rs.eof
i=i+1
strLen1=Len(rs("CaseName")) strLen2=Len(rs("CaseID")) 'str=Right(" Taiwan ",2)
mp3file=Right(rs("CaseID"),(strLen2-strLen1)) 'Response.Write rs("CaseID") & vbCrLf
s1=Split(rs("StartTime") , " ")
%>
<tr style="text-align:center">
<td align="center" bgcolor="#F2E4C1"
bordercolor="#A9EC88"><a href="play.asp?id=<% =mp3file %>"><font size="6"><% =s1(0) %><% =s1(1) %><% =s1(2) %></font></td>
</tr>
<%
rs.movenext wend
'Response.Write CaseName1 'response.end
%>
<tr align="center">
<td align="center"><img border="0"
src="images/pic2.png"></td>
</tr>
</table>
</div>
</body>
</html>
附錄五 手機版網頁播放節目程式碼
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Language" content="zh-tw">
<meta http-equiv="Content-Type" content="text/html; charset=Big5">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
<meta name="APPLE-mobile-web-app-capable" content="yes">
<meta name="APPLE-mobile-web-app-status-bar-style" content="black">
<title>radio</title>
<link href="skin/pink.flag/jplayer.pink.flag.css" rel="stylesheet" type="text/css"
/>
<script type="text/javascript"
src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery.jplayer.min.js"></script>
<!--[if lt IE 9]>
<script src="pngfix.js"></script>
<![endif]-->
<!-- #include file="connectdb.inc" -->
<%
playfile="http://203.71.144.5/mp3/" & request("id") & ".mp3"
'Response.Write playfile
SQLstr="select * from Schedule where CaseID like '%" & request("id") &
"%'"
set rs=adocon.Execute(SQLstr) while not rs.eof
CaseName=rs("CaseName") rs.movenext
wend
%>
<script type="text/javascript">
//<![CDATA[
// TMP For testing on standard browsers.
// $.jPlayer.platform.Android = true;
var file1 = "<%= playfile %>";
var jPlayerAndroidFix = (function($) { var fix = function(id, media, options) { this.playFix = false;
this.init(id, media, options);
};
fix.prototype = {
init: function(id, media, options) {
var self = this;
// Store the params this.id = id;
this.media = media;
this.options = options;
// Make a jQuery selector of the id, for use by the jPlayer instance.
this.player = $(this.id);
// Make the ready event to set the media to initiate.
this.player.bind($.jPlayer.event.ready, function(event) { // Use this fix's setMedia() method.
self.setMedia(self.media);
});
// Apply Android fixes if($.jPlayer.platform.Android) {
// Fix playing new media immediately after setMedia.
this.player.bind($.jPlayer.event.progress, function(event) { if(self.playFixRequired) {
self.playFixRequired = false;
// Enable the contols again
// self.player.jPlayer('option',
// self.player.jPlayer('option',