我們利用Adobe FMS 4.5錄製來自用戶網絡攝像頭的視頻。我們並未實時播放此視頻,我們只是想將其捕獲並保存在服務器上,以便稍後處理它(附加到用戶帳戶,顯示爲頁內容等)。發佈/錄製到FMS4.5在視頻開始時留下小缺口
我們已經編寫了一個強大的捕獲應用程序,它可以傳輸到服務器,取消正確發佈,並允許用戶在完成取消發佈後查看視頻等。這似乎起作用,因爲它將視頻文件保存爲我們期待。
問題是,那些錄製的視頻在開始時似乎有一個小小的差距。這大大小於一秒鐘。我們正在談論的可能是5/100s到1/10秒,沒有視頻數據。它看起來好像在視頻的一開始就沒有視頻關鍵幀。
現在,這通常不會成爲一個問題 - 視頻只是開始播放一下,並在大多數播放器中播放良好。問題是,我們允許用戶稍後使用不同的工具隨意裁剪視頻 - 這是一個定製的FFmpeg可視界面。如果他們在第一個關鍵幀之前開始視頻剪輯,則在最終輸出中會出現一個難看的灰色混亂,因爲在FFmpeg開始剪切的區域沒有可視數據。我的第一個想法是,「哦,我必須要附加相機(不同的|在不同的點|在一些回調|等)」。在NetStream.Publish.Start等發佈之後,我會在播放之前附加相機。
我是否缺少內在的東西?或者我只是在用錯誤的想法工作,或者我誤解了這個過程?
當然,我完全期望的答案,但不想要的是,「這就是FMS如何做到的。」 :)我們可以添加一個服務器端進程來刪除第一個XX位的視頻,但它是任意的;我們不知道需要調整多少,我們不希望冒任何用戶數據丟失的風險。
下面是我們使用的代碼的概括:
private function init():void
{
var my_errors:Array = [];
if (!Camera.isSupported)
{
my_errors.push('camera is not supported');
}
else
{
camera = Camera.getCamera();
if (!camera)
{
my_errors.push('no camera found');
}
else if (camera.muted)
{
Security.showSettings(SecurityPanel.PRIVACY);
}
}
mic = Microphone.getMicrophone();
if (!mic)
{
my_errors.push('no microphone found');
}
if (my_errors.length)
{
this.fatal_error(my_errors);
return;
}
camera.setMode(camera_width, camera_height, camera_fps, true);
camera.setQuality(0, camera_quality);
netconnect = new NetConnection();
netconnect.addEventListener(NetStatusEvent.NET_STATUS, net_status_handler);
netconnect.connect(publish_url);
}
private function net_status_handler(ev:NetStatusEvent):void
{
switch (ev.info.code)
{
case 'NetConnection.Connect.Success':
trace('CONNECT: Connected to "' + publish_url + '"');
begin_stream();
break;
}
}
private function begin_stream():void
{
if (this.recording)
return;
this.recording = true;
guid = GUID.create();
netstream = new NetStream(netconnect);
netstream.addEventListener(NetStatusEvent.NET_STATUS, net_stream_handler);
netstream.attachCamera(camera);
netstream.attachAudio(mic);
netstream.publish(guid, 'record');
}