2016-09-29 24 views
0

()由節點JS createWriteStream生成的文件我對AWS運行安裝時的視頻文件被上傳到S3桶觸發一個AWS lambda函數。將Lambda函數寫入節點並下載文件,將其流式傳輸到臨時工作文件,然後在其上執行ffprobe,然後執行ffmpeg命令。ffprobe無法讀取AWS

ffprobe引發以下錯誤:

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x4ea8e20] error reading header download: Invalid data found when processing input 

的錯誤是難以複製和只出現一半的時間,我相信是因爲程序的異步性質。

我的主要功能如下

downloadFile(library.getDownloadStream, logger, sourceLocation, localFilePath) 
     .then(() => ffprobe(logger)) 
     .then(() => ffmpeg(logger, keyPrefix)) 
     .then(() => removeDownload(logger, localFilePath)) 
     .then(() => uploadFiles(library.uploadToBucket, logger, keyPrefix)) 
     .then(data => invocation.callback()) 
     .catch(error => invocation.callback(error)); 

的ffprobe功能:

function downloadFile(downloadFunc, logger, sourceLocation, download) { 
    return new Promise((resolve, reject) => { 
     logger.log(`Starting download: ${sourceLocation.bucket}/${sourceLocation.key}`); 

     var downloadFile = createWriteStream(download); 

     downloadFunc(sourceLocation.bucket, sourceLocation.key) 
      .on('end',() => { 
       logger.log("closing writing stream"); 
       downloadFile.end(); 

       logger.log('Download finished'); 

       resolve(); 
      }) 
      .on('error', reject) 
      .pipe(downloadFile); 
    }); 
} 

每個編譯/更新上傳最新的ffmpeg版本AWS。我無法在本地重現此錯誤。

爲什麼ffprobe在頭文件中拋出這個錯誤?

更新

登錄下載的文件的文件大小的打印完全相同相同數量的字節,無論羯羊ffprobe的成功與否。

但是,當我設置解決承諾之前超時,則錯誤不再出現,並ffprobe成功運行每次:

downloadFunc(sourceLocation.bucket, sourceLocation.key) 
     .on('end',() => { 

      logger.log('Download finished'); 

      // Filesize 
      var meta = fs.statSync(download); 
      var fileSizeInBytes = meta["size"]; 

      logger.log(fileSizeInBytes); 

      // resolve(); 
      setTimeout(resolve, 1000); 
     }) 
     .on('error', reject) 
     .pipe(downloadFile); 

這究竟是爲什麼?

+0

什麼ü沒有明確的關於「完成」從downloadfile和事件何種形式通過downloadfile返回的承諾,包括由下一個承諾(ffprobe)... FWIW在節點/ Heroku的,我有一個裁判的媒體使用(ffmpeg函數)爲fs實現輸出tmp文件來處理... –

回答

1

我不認爲你需要downloadfile.end,如果你是管道。也許這就是問題所在。結束事件是否在完成寫入管道後發生?解決之前可能會稍微延遲一段時間。您也可以在下次調試時手動檢查服務器上的文件長度,並查看是否寫入了所有文件。

+0

我添加了end()語句,因爲我認爲問題是由於沒有關閉它而導致的徒勞無功。我會嘗試手動檢查文件大小。由於只有一半的請求發生了錯誤,我認爲這是由於下載沒有正確完成而導致的? – matthiasdv

+0

我根據你推薦的東西更新了我原來的問題。我很困惑。 – matthiasdv