最近在做一個有關視頻直播和點播的項目,客戶的一個需求就是可以控制對直播流的錄制,直播的實現采用的是Adobe的Flash Media Server,具體方式就是:視頻采集端采集視頻並編碼->rtmp流輸出->FMS服務器->rtmp流廣播->客戶端播放器加載rtmp流->播放;直播流的錄制采用在FMS服務器上錄制的方式,而不是在視頻采集設備端進行錄制。
由於客戶要求進行可控錄制,所以不能采用那種在視頻流發送端就寫好參數如: nc.publish("livestream","record") 的方式,而是采用了Adobe提供的一個用於FMS的Application,叫做dvrcast,它的實現實際是寫了好多的FMS服務器端的as代碼(.asc格式的文件),通過調用FMS服務器端的Stream類的record方法來進行錄制,通常record方法會錄制為.flv文件,最近通過查看FMS自帶的一些開發文檔,終於搞清楚了如何將視頻流錄制為.mp4文件,具體方法如下:
假設 視頻采集端發過來的視頻流是livestream,如 nc.publish("livestream","live");//采用直播模式發送
在服務器端想對該視頻進行錄制,則使用如下代碼:
s=Stream.get("mp4:yourRecordName.mp4");//獲取一個Stream對象,注意參數,錄制mp4或f4v文件時,必須加前綴"mp4:",yourRecordName是你想保存的名字
if(s){
s.record("record");//開始錄制,"record"參數可選,表示如果存在yourRecordName.mp4文件,會進行覆蓋
s.play("livestream");//此句比較重要,如果不寫的話,你會發現所創建的.mp4文件體積不變,此句代碼相當於FMS服務器端接管了livestream流的publish工作,因為服務器端的play方法優先於視頻采集端的publish方法
}
如果想停止錄制,則代碼如下:
s=Stream.get("yourRecordName");//可以寫"mp4:yourRecordName.mp4",也可以只寫yourRecordName
if(s) s.record(false);//停止錄制
所錄制的視頻文件可以通過FMS服務器進行點播播放。
但悲催的是,我現在發現,錄制的mp4視頻文件不能用播放器打開,也就是說,用戶下載到本地后將無法使用播放器進行觀看,而只能在網上通過點播服務來觀看,不知道為什么,FMS錄制的mp4格式和平常的mp4格式不一樣嗎??? 這還是個不小的問題啊,希望有做過這方面的同志能夠給與我幫助! 不勝感激!!!
QQ:2429200513