Как сохранить видео, записанное с помощью MediaRecorder API, на сервер php?

Я могу записать видео с веб-камеры, воспроизвести получившийся блоб в браузере и загрузить его на локальный компьютер, но когда я сохраняю файл на сервере, он не читается. Я попытался отправить чанки на сервер и объединить их там, а также отослать весь большой двоичный объект, но результат тот же (нечитаемое видео). Сначала я читаю большие двоичные объекты с помощью FileReader(), который дает результат base64, затем отправляю его на сервер, где я использую base64_decode() и сохраняю его в папке.

JS код:

var reader = new FileReader(); 
reader.readAsDataURL(chunks[index]);
reader.onload = function () {
  upload(reader.result, function(response){
    if(response.success){
      // upload next chunk
    }
  });
};

на сервере:

$json = json_decode( $request->getContent(), true );
$chunk = base64_decode( $json["chunk"] );
// all chunks get
file_put_contents("/uploadDirecotry/chunk".$json['index'].".webm", $json["chunk"]);

Когда все куски загружены:

for ($i = 0; $i < $nrOfChunks; $i++) {
  $file = fopen("/uploadDirectory/chunk".$i.".webm", 'rb');
  $buff = fread($file, 1024000);
  fclose($file);

  $final = fopen("/processed/".$video->getFileName()."-full.webm", 'ab');
  $write = fwrite($final, $buff);
  fclose($final);

  unlink("/uploadDirectory/chunk".$i.".webm");
}

Я не знаю, что я делаю неправильно. Больше недели я пытался заставить это работать, но это не сработает. Пожалуйста помоги!

1 ответ

Решение

Вы должны сохранить декодированный кусок

вместо этого

file_put_contents("/uploadDirecotry/chunk".$json['index'].".webm", $json["chunk"]);

использовать этот

file_put_contents("/uploadDirecotry/chunk".$json['index'].".webm", $chunk);

Также я предлагаю открыть окончательный файл перед "циклом for" в режиме записи и закрыть его после цикла вместо того, чтобы открывать каждый раз в "for loop".

Другие вопросы по тегам