2013-01-23 50 views
1

我有一個自定義播放器可播放錄音(僅音頻)。如果音頻文件很長,NetStream類不會很好地找到它。我發現在16776秒(04:39:36)之後,NetStream查找功能從文件開頭再次啓動。這裏是最短的僞代碼:無法超越16776秒

package com.name.player 
{ 
    import flash.net.NetConnection; 
    import flash.net.NetStream; 
    ... 

    public class StreamingPlayer extends Sprite 
    { 
     public var maStream:NetStream; 
     ... 

     public function aFunction 
     { 
      maStream = new NetStream(maConnection); 
      maStream.inBufferSeek = true; // ==> Generates compile error: 
      //Error: Access of possibly undefined property inBufferSeek through a reference with static type flash.net:NetStream. 
      // [mxmlc] 
      // [mxmlc]    maStream.inBufferSeek = true; 
      // [mxmlc]     ^

      maStream.play('sName', 0, -1, true); 
      // Now try these (one at a time) 
      maStream.seek(16775); // Seeks to the desired position and plays the file till the end 
      maStream.seek(16776); // Seeks at second 0 (begining) 
      maStream.seek(16778); // Seeks at second 0 (begining) 
      maStream.seek(16780); // Seeks at second 3 
      maStream.seek(16786); // Seeks at second 9 
      maStream.seek(16796); // Seeks at second 19 
      ... 

     } 
     ... 
    } 
    ... 
} 

我嘗試了不同的格式(Speex語音,WAV)/碼/比特率:
- RIFF(小端)數據,WAVE音頻,ITU G.711 A律,單8000赫茲
- RIFF(小端)數據,WAVE音頻,微軟PCM,16位,單44100赫茲
- 奧格數據的Speex音頻

的文件大小或總長度不要緊,我嘗試在1.1 - 1500 MB和04:40:00(17000秒)到14:56:41(53801秒)之間嘗試。

我爲新瀏覽器使用html5,但我們仍然需要支持舊瀏覽器(在某些客戶端PC上無法更新安裝新軟件,所以我需要這些Flash解決方案,因爲Flash已安裝並沿側IE6 :()運行

問:
難道我做錯事或存在NetStreamer的限制,如果有什麼解決辦法(S)我必須能夠發揮這些長文件?

PS這是我第一次使用閃存,所以請嘗試更明確一點,如果你有答案/評論。

編輯:在Adobe身份證新增的bug 3492103.

編輯:
我有一個同事測試流服務器,他發現一些野趣的日誌:

// This is lower than 16776 seconds, and works 
01-26 13:02:14.277 RtmpProtocol:891  [ID-007] Seeking to 1594380 
... 
01-26 13:02:14.279 FileReaderWav:194  [ID-007] <Stream0001> Seeking to 15943804 sf_seek 127550432 
... 
01-26 13:02:16.250 FileReaderWav:230  [ID-007] <Stream0001> Current position: 15943824 

// This is when it plays from the beginning (seeking after 16776 seconds) 
// according to the log it should just play at the desired position, but it's not 
01-26 13:02:23.294 RtmpProtocol:891  [ID-007] Seeking to 16990012 
01-26 13:02:23.303 FileReaderWav:194  [ID-007] <Stream0001> Seeking to 16990012 sf_seek 135920096 
01-26 13:02:23.463 FileReaderWav:230  [ID-007] <Stream0001> Current position: 16990032 

我們migth在流服務器中有問題,有些INTEGER轉換或類似的東西。我會更新,如果我得到更多的信息。

謝謝

+0

Theres沒有在文檔中建議17000+不是一個可接受的值,並且沒有爲NetStream.seek()記錄的錯誤。也許你發現了一個新的?我懷疑很多用戶試圖在 – 2013-01-23 15:15:41

+0

@LeeBurrows之前播放這麼長的文件。我有什麼方法可以填充一個錯誤?從發展的角度來看,AFAIK閃存或多或少已經死亡,但我認爲應該讓他們知道。 –

+0

錯誤可以在這裏提交:https://bugs.adobe.com/。而Flash肯定沒有死; Flash網站可能會自動生成,但不會自動生成 – 2013-01-28 19:38:01

回答

2

我認爲你必須考慮,如果文件被完全緩衝到所需的搜索位置。如果您正嘗試STREAM文件(又名未完全加載),並尋找文件的位置未完全加載...它會產生一個錯誤,或只是不去那裏。

的解決方案:

(1)確保文件正在尋求

(2)使用PHP(或任何服務器端)爲您服務文件AT所需點之前被緩存到那個位置。這將爲您節省帶寬上的音調,因爲只有所請求的數據將被傳遞。

例如,如果你要求的文件是1500MB,但你只需要800-1500mb ...然後在該位置提供文件。

+0

我生成了一個1.1 Mb的ogg文件,它很容易放入緩衝區,並且在同一秒鐘內有同樣的問題。我傾向於認爲這是NetStream中的一個錯誤,考慮到閃存或多或少已經死亡,這不會被修復。 –

+0

@RaduMaris Flash遠沒有死,我不確定使用Apache的更新過程,但我相信他們有能力處理問題/更新。對於你的問題,這可能是一個錯誤。我個人傾向於分割文件和服務塊(以節省帶寬),所以我沒有遇到過這種情況。但我今晚會測試一下,讓你知道我的發現。另外嘗試[inBufferSeek],它是NetStream的一種方法,它應該告訴你數據是否被「智能」流緩衝(http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/ NetStream.html) –

+0

我有一個錯誤嘗試inBufferSeek「錯誤:訪問可能未定義的屬性inBufferSeek通過引用與靜態類型flash.net:NetStream」。我更新了代碼以查看netStream的定義位置和方式。免責聲明:我沒有構建播放器,這是我第一次使用閃光燈:) –