2011-09-06 101 views
0

讓我先確定我想要做什麼:在網站上錄製音頻:Red5流或發佈音頻數據?

我的用戶能夠在我的網站上錄製voicenotes,爲索引添加標籤以索引標題以及標題。保存筆記後,我將筆記的路徑以及其他信息保存在我的數據庫中。

現在,我有2個選擇做記錄,都涉及嵌在我的網站瑞士法郎:

1)我可以用Red5的流媒體服務器音頻到我的服務器,並保存文件並返回路徑到我的應用程序來做數據庫保存,似乎相當複雜,因爲我將不得不轉換音頻,並將其移動到屬於服務器端Red5應用程序,我不是很知道如何構建。

2)我可以簡單地記錄音頻並獲取其字節數組,並對其執行Base64編碼,並將其連同剩餘數據一起發送到PHP(可通過簡單的POST或AJAX調用),解碼它在服務器上,並使用適當的擴展名的文件,音頻轉換也會發生在這裏使用ffmpeg,這個選項似乎更簡單,但我不知道它是多麼可行。

,你會說什麼的選擇是更可行和更容易開發?在此先感謝

回答

4

根據記錄的計劃持續時間,你很可能能夠使用選項第二把交椅。我最近在一個項目中成功地使用了類似的方法,但錄製只有30秒左右。這是我做了不同於你所建議,雖然,所以我認爲這是更好:

  • 從麥克風捕捉聲音,並將其存儲到一個ByteArray中,使用的是派出每當更多SAMPLE_DATA事件聲音數據從麥克風進入。文檔中有一個例子可以很好地解釋這一點。

  • 因爲大多數用戶會在正常的家用電腦沒有任何特殊的錄音設備,它是安全的假設,記錄的全保真是沒有必要的。我僅使用每個採樣2個字節,並且只使用單聲道,而不是使用從SAMPLE_DATA事件的麥克風獲得的完整64位浮點數(AS3 Number)。簡單閱讀Number並做myFloatSample * 0x7fff轉換爲16位有符號整數。

  • ,如果你只是在錄音講話或別的東西,在這個頻率範圍內,不要使用本地44.1kHz的採樣率。在22.05kHz的情況下,你可能會得到很好的效果,這將會在半數的時間內減少數據量。只需相應地設置Microphone.rate屬性。

  • 不要用的Base64編碼數據。將它作爲二進制數據發送,這將顯着更小。您可以將它作爲原始POST數據或使用AMF之類的東西發送。此外,在發送之前,請使用ByteArray上的本機compress()deflate()方法對其進行壓縮。在服務器上,分別使用ZLIB或原始DEFLATE(充氣)算法進行解壓縮,即PHP supports

  • 一旦解壓縮在服務器上,你有什麼本質上是所謂的原始16位單聲道PCM流。順便說一句,這應該是ffmpeg(或lame)支持的輸入格式之一,所以你應該能夠將它編碼爲mp3,而不必先進行任何手動解碼。

顯然,Red5解決方案可能會更好,因爲它更適合於該任務。但是,如果您沒有資源來設置Red5服務器,或者不想使用Java,只要遠離過長的錄製,上述解決方案就可以很好地工作。

舉一個簡單的例子,以每秒22050個採樣30秒記錄,每個樣品2個字節將是〜1.3MB。即使一旦放氣,傳輸到服務器的音頻數據仍可能在30秒內達到幾兆字節。這可能會或可能不會被您的應用程序接受。

+0

感謝您的答覆,似乎是一個非常完整的解決方案。雖然文件大小似乎有點大。這很奇怪,因爲使用Red5錄製音頻和視頻時,flv文件最終會在20秒鐘的音頻和視頻中達到大約400K。現在的事情是,我怎樣才能從閃存中獲取音頻流?看起來,除非你使用像FMS或Red5這樣的服務器,否則這是不可能的,你是如何設法捕捉它的? – 8vius

+0

忘記提到我想允許的最多2分鐘的錄音,現在 – 8vius

+0

重新捕獲聲音,我編輯我的上述迴應。由於音頻在客戶端被破壞性地編碼(例如使用MP3),所以流傳輸時的文件大小非常小。您可能也想在AS3的客戶端上考慮這樣做,但我懷疑在如此慢的系統上編碼所花的時間,淨效應可能會比發送PCM需要更長的時間。 – richardolsson