第五章 結論與建議
第三節 建議
跨平台網路廣播系統經過實際測次後,已能補助廣播電臺提供更多的收聽管 道,本節是對本系統及未來趨勢提出相關建議。
壹、 介面設計使用 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', 'cssSelectorAncestor', self.cssSelectorAncestor);
// Play if required, otherwise it will wait for the normal GUI input.
if(self.playFix) {
self.playFix = false;
$(this).jPlayer("play");
} } });
// Fix missing ended events.
this.player.bind($.jPlayer.event.ended, function(event) { if(self.endedFix) {
self.endedFix = false;
setTimeout(function() { self.setMedia(self.media);
},0);
// what if it was looping?
} });
this.player.bind($.jPlayer.event.pause, function(event) { if(self.endedFix) {
var remaining = event.jPlayer.status.duration
-event.jPlayer.status.currentTime;
if(event.jPlayer.status.currentTime === 0 ||
remaining < 1) {
// Trigger the ended event from inside jplayer instance.
setTimeout(function() {
self.jPlayer._trigger($.jPlayer.event.ended);
},0);
} } });
}
// Instance jPlayer
this.player.jPlayer(this.options);
// Store a local copy of the jPlayer instance's object this.jPlayer = this.player.data('jPlayer');
// Store the real cssSelectorAncestor being used.
this.cssSelectorAncestor = this.player.jPlayer('option', 'cssSelectorAncestor');
// Apply Android fixes
this.resetAndroid();
return this;
},
setMedia: function(media) { this.media = media;
// Apply Android fixes this.resetAndroid();
// Set the media
this.player.jPlayer("setMedia", this.media);
//audio autoplay
//this.player.jPlayer("play");
return this;
},
play: function() {
// Apply Android fixes
if($.jPlayer.platform.Android && this.playFixRequired) { // Apply Android play fix, if it is required.
this.playFix = true;
} else {
// Other browsers play it, as does Android if the fix is no longer required.
this.player.jPlayer("play");
}
},
resetAndroid: function() { // Apply Android fixes
if($.jPlayer.platform.Android) { this.playFix = false;
this.playFixRequired = true;
this.endedFix = true;
// Disable the controls
// this.player.jPlayer('option', 'cssSelectorAncestor', '#NeverFoundDisabled');
} } };
return fix;
})(jQuery);
$(document).ready(function() {
var id = "#jquery_jplayer_1";
var bubble = {
mp3:file1 };
var lismore = { mp3:file1 };
var options = {
swfPath: "js", supplied: "mp3", wmode: "window", smoothPlayBar: true, keyEnabled: true };
var myAndroidFix = new jPlayerAndroidFix(id, bubble, options);
$('#setMedia-Bubble').click(function() { myAndroidFix.setMedia(bubble);
$('.jp-title ul li').text('Bubble');
});
$('#setMedia-Bubble-play').click(function() { myAndroidFix.setMedia(bubble).play();
$('.jp-title ul li').text('Bubble');
});
$('#setMedia-Lismore').click(function() { myAndroidFix.setMedia(lismore);
$('.jp-title ul li').text('Lismore');
});
$('#setMedia-Lismore-play').click(function() { myAndroidFix.setMedia(lismore).play();
$('.jp-title ul li').text('Lismore');
});
});
//]]>
</script>
</head>
<body >
<div align="center">
<table>
<tr align="center">
<td align="center"><img border="0"
src="images/title2.png"></td>
</tr>
<tr align="center">
<td align="left">
<div id="jquery_jplayer_1" class="jp-jplayer"></div>
<div id="jp_container_1" class="jp-audio">
<div class="jp-type-single">
<div class="jp-gui jp-interface">
<ul class="jp-controls">
<li><a href="javascript:;" class="jp-play"
tabindex="1">play</a></li>
<li><a href="javascript:;" class="jp-pause"
tabindex="1">pause</a></li>
<li><a href="javascript:;" class="jp-stop"
tabindex="1">stop</a></li>
<li><a href="javascript:;" class="jp-mute"
tabindex="1" title="mute">mute</a></li>
<li><a href="javascript:;" class="jp-unmute"
tabindex="1" title="unmute">unmute</a></li>
<li><a href="javascript:;" class="jp-volume-max"
tabindex="1" title="max volume">max volume</a></li>
</ul>
<div class="jp-progress">
<div class="jp-seek-bar">
<div class="jp-play-bar"></div>
</div>
</div>
<div class="jp-volume-bar">
<div class="jp-volume-bar-value"></div>
</div>
<div class="jp-current-time"></div>
<div class="jp-duration"></div>
<ul class="jp-toggles">
<li><a href="javascript:;" class="jp-repeat"
tabindex="1" title="repeat">repeat</a></li>
<li><a href="javascript:;" class="jp-repeat-off"
tabindex="1" title="repeat off">repeat off</a></li>
</ul>
</div>
<div class="jp-title">
<ul>
<li><font size="3" ><% =CaseName
%></font></li>
</ul>
</div>
<div class="jp-no-solution">
<span>Update Required</span>
To play the media you will need to either update your browser to a recent version or update your <a href="http://get.Adobe.com/flashplayer/" target="_blank">Flash plugin</a>.
</div>
</div>
</div>
</td>
<tr align="center">
<td align="center"><img border="0" src="images/pic2.png"></td>
</tr>
</tr>
</table>
</div>
</body>
</html>
附錄六 資料庫語言節目篩選程式碼
Set WshShell = WScript.CreateObject ("WScript.Shell") Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile("D:\copyASF\copyASF.bat", True) objFile.WriteBlankLines(1)
objFile.WriteLine "d:"
objFile.WriteLine "cd\FormatFactory"
Dim objconn, rs
set objconn = wscript.createobject("adodb.connection") set rs = wscript.createobject("adodb.recordset")
objconn.open "Driver={SQL
Server};Server=127.0.0.1;UID=sa;PWD=xxxx;database=Encoderserver"
rs.open "Select * FROM Schedule",objconn,1 If err.number <> 0 Then
Msgbox err.source & err.description,16,err.source & "error!!"
wscript.quit End If
str2=rs("location") str3=rs("CaseName") str4=(" D:\mp3\") str5=rs("CaseID") str7=rs("LinkName") str6=".ASF /XO /S /purge"
str8="FormatFactory.exe " & """" & "All to MP3""" & " " & """" & "High quality"
str8="FormatFactory.exe " & """" & "All to MP3""" & " " & """" & "High quality"