在ffmpeg中使用内容类型quicktime抛出错误`moov not found`

时间:2019-05-02 18:56:03

标签: javascript node.js powershell ffmpeg

因此,我的程序已设置为下载视频并将其流式传输为文件。这些视频是.mp4和.mov。

问题在于.mov文件不起作用,我认为这只是我流式传输文件的方式。但我不确定。因为.mp4文件可以正常工作而没有任何错误。但是当我使用.mov文件时,出现错误提示

  

Powershell错误:找不到[mov,mp4,m4a,3gp,3g2,mj2 @ 000002707b9cb700] moov原子未找到

哪个来自此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" });
  });

注释 .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}`
  ]);

1 个答案:

答案 0 :(得分:0)

MOV和MP4使用相同的内部结构。 MP4只是MOV通过ISO标准化后的名称,因此两者之间的重命名没有问题。

您应该等到视频文件完全写入后,再尝试从中提取任何内容。