• 沒有找到結果。

第五章 結論與建議

第三節 建議

跨平台網路廣播系統經過實際測次後,已能補助廣播電臺提供更多的收聽管 道,本節是對本系統及未來趨勢提出相關建議。

壹、 介面設計使用 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"

相關文件