javascript - 在 ffmpeg 中使用内容类型 quicktime 时会抛出错误“找不到 moov”
问题描述
所以我的程序设置为下载视频并将其流式传输到文件中。这些视频是 .mp4 和 .mov。
问题是 .mov 文件不起作用,我认为这只是我流式传输文件的方式。但我不确定。因为 .mp4 文件没有任何错误。但是当我使用 .mov 文件时,我收到一条错误消息
Powershell 错误:[mov,mp4,m4a,3gp,3g2,mj2 @ 000002707b9cb700] moov atom not found
这来自这个powershell脚本:
ffmpeg -i $Args[0] -vcodec copy -acodec copy -movflags +faststart $Args[1]
调用该脚本的代码如下:
streamVideos_PROMISES.push(
axios({
method: "get",
url: video.url,
responseType: "stream"
})
);
}
});
Promise.all(streamVideos_PROMISES)
.then(function(response) {
response.map(response_item => {
let tempFileName = new Date().valueOf();
let videoType = response_item.headers["content-type"].split("/")[1];
if (videoType === "quicktime") videoType = "mov"; <---Maybe the issue?
const file = fs.createWriteStream(
`./cache/videos/${tempFileName + "."}${videoType}`
);
var spawn = require("child_process").spawn,
child;
response_item.data.pipe(file);
child = spawn("powershell.exe", [
"./scripts/ffmpeg_convert.ps1",
`./cache/videos/${tempFileName + "."}${videoType}`,
` ./cache/converted_videos/${tempFileName + "."}${videoType}`
]);
child.stdout.on("data", function(data) {
console.log("Powershell Data: " + data);
});
child.stderr.on("data", function(data) {
console.log("Powershell Errors: " + data);
});
child.on("exit", function() {
console.log("Finished converting thumbnails");
return thumbsupply.generateThumbnail(
`./cache/converted_videos/${tempFileName + "."}${videoType}`,
{
mimetype: response_item.headers["content-type"]
}
);
});
child.stdin.end(); //end input
});
})
.catch(err => {
console.log(err);
res.status(500).json({ Error: "Could not generate thumbnail" });
});
注意for .mov 是快速
的response_item.headers["content-type"].split("/")
,所以我认为我可以交换扩展名......这可能是错误的。
编辑
所以我手动输入$args
如下:
ffmpeg -i "./cache/videos/1556897345129.mov" -vcodec copy -acodec copy -movflags +faststart "./cache/converted_videos/are_you_kidding_me.mov"
它有效。
编辑 2
child = spawn("powershell.exe", [
"./scripts/ffmpeg_convert.ps1",
"./cache/videos/1556897345129.mov", <-- Using the string literal works.
` ./cache/converted_videos/${tempFileName + "."}${videoType}`
]);
解决方案
MOV 和 MP4 使用相同的内部结构。MP4只是MOV被ISO标准化后的名称,因此两者之间重命名没有问题。
在尝试从中提取任何内容之前,您应该等到您的视频文件完全写入。
推荐阅读
- javascript - 如何在服务工作者中代理 jsonp 调用
- spring-boot - 如何知道 Spring Batch 作业是否第一次运行
- javascript - 如何检测 Emscripten 生成的 .js 何时完成加载 wasm,以便我可以运行调用它的 JS 函数?
- ios - 为什么 Unity iOS 应用程序如此庞大?
- python - 如何在 tkinter 中为类创建多个选项卡
- c# - 在 ML.net 中显示“predictionEngine”
- mysql - 这是一个非常简单的 MySQL 查询
- ios - Xamarin iOS - 发布失败,在 iOS 13 更新后开始发生
- sql - 我该怎么做才能获得所有选定的名称?
- java - apiDoc 中@apiParam 的使用