Работа с типом контента quicktime в ffmpeg выдает ошибку `moov not found` - PullRequest
0 голосов
/ 02 мая 2019

Итак, моя программа настроена так, чтобы загружать видео и передавать его в файл. Это видео .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" });
  });

примечание response_item.headers["content-type"].split("/") для .mov - это быстрое время, поэтому я предположил, что могу поменять местами расширения ... Что, вероятно, неправильно.

Редактировать Поэтому я вручную набрал $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 голосов
/ 06 мая 2019

MOV и MP4 используют одинаковую внутреннюю структуру. MP4 - это просто имя после того, как MOV был стандартизирован ISO, поэтому никаких проблем при переименовании между ними.

Вы должны подождать, пока ваш видеофайл будет полностью записан, прежде чем пытаться извлечь из него что-либо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...