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