2012-08-14 77 views
2

我正在使用簡單的as3 + php,沒有FMS或之間的這種。我正在製作一個視頻錄製應用程序,我可以捕獲幀並將它們轉換爲flv編碼的bytearray。但是當我嘗試將它保存在服務器上時,問題就會發生。如果我通過base64編碼將字節數組轉換爲字符串,然後將該字符串發送到服務器,所有工作都可以,但問題是由於它是一個視頻文件,它可能非常大,例如20mb左右,因此需要很長一段時間才能對其進行編碼並上傳,而且在編碼過程中通常會發生腳本超時。爲了加快速度,我試圖直接發送字節數組,但是我的螢火蟲網絡面板顯示發送的數據大約在20-46字節。請告訴我我做錯了什麼。如何通過php在服務器上保存bytearray?

//var encoded_str = Base64.encodeByteArray(_baFlvEncoder.byteArray); 
      //Handle Upload 
      /*var url_data:URLVariables = new URLVariables(); 
      url_data.data = _baFlvEncoder.byteArray;*/ 
      var url_ref:URLRequest = new URLRequest("save_vid.php"); 

      url_ref.contentType = 'application/octet-stream'; 
      url_ref.data = _baFlvEncoder.byteArray;//url_data; 
      url_ref.method = URLRequestMethod.POST; 

      var urlLoader:URLLoader = new URLLoader(); 

      // just making sure the server knows we are sending data in proper format 
      //urlLoader.dataFormat = URLLoaderDataFormat.TEXT; 
      urlLoader.dataFormat = URLLoaderDataFormat.BINARY; 

      try { 
       urlLoader.load(url_ref); 
      } catch (e:Error) { 
       trace(e); 
      } 

我的PHP代碼:

<?php 
echo 'Data:<pre>'; 
print_r($_POST); 
echo '</pre>'; 
//$decodedData= base64_decode($GLOBALS[ 'HTTP_RAW_POST_DATA' ]); 
//file_put_contents("test.flv",$decodedData); 
file_put_contents("test.flv",$GLOBALS[ 'HTTP_RAW_POST_DATA' ]); 
?> 

回答

4

URLRequest.data documentation,它指定直接使用的ByteArray的選項。

這裏,

urlLoader.data = _baFlvEncoder.byteArray; 

然後,您可以跳過URLVariables對象,它依賴於編碼的傳輸數據application/x-www-form-urlencoded,這是不適合二進制數據(即使它被妥善處理,它可能不是)。

+0

ooh謝謝,我不知道這一點。這一次,雖然看起來數據正在發送,視頻文件沒有被生成....我得到0kb flv文件。 – Bluemagica 2012-08-14 02:47:51

+0

不知道你的PHP代碼是否仍然如上所示 - 你顯然不希望base64_decode這個輸入。 @亞當在這裏的建議看起來很合理,但我不是一個PHP人。 – 2012-08-14 02:52:21

+0

我更新了代碼以反映更改。請看看... – Bluemagica 2012-08-14 02:54:35

3

也許你應該使用這個原始數據輸入:

$input = file_get_contents("php://input"); 
+1

謝謝你,我希望我可以選擇兩個答案....但真的,非常感謝 – Bluemagica 2012-08-14 02:59:37

0

我用類似的問題堆積了幾天,發佈,只有使用Base64編碼/解碼解決這個問題。類似的症狀只是幾個字節去等,所以只需進入base64「方向」來解決這個問題

相關問題