Как сохранить видео, записанное с помощью 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");
}

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


person Grigor Malo    schedule 28.08.2017    source источник
comment
Может быть, здесь также есть ответ на этот вопрос: title="отправить большие двоичные объекты mediarecorder на сервер и создать файл на серверной части"> stackoverflow.com/questions/52680587/   -  person Cesar Morillas    schedule 27.10.2020
comment
Может быть, здесь также есть ответ на этот вопрос: title="отправить большие двоичные объекты mediarecorder на сервер и создать файл на серверной части"> stackoverflow.com/questions/52680587/   -  person Cesar Morillas    schedule 27.10.2020


Ответы (1)


вы должны сохранить декодированный фрагмент

вместо этого

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

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

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

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

person tan    schedule 28.08.2017
comment
Большой! Большое спасибо! Много возился с ним, несколько раз менял код и пропустил эту маленькую опечатку. Также пришлось добавить эту строку: $json[chunk] = str_replace('data:video/webm;base64,', '', $json[chunk]); перед декодированием, чтобы заставить его работать. - person Grigor Malo; 28.08.2017