Javascriptで録画をするとWebMという形式で保存されてしまいます。webmはiPhoneなどで再生できないため使いにくいです。
ビデオをmp4で録画・保存することはできますか?
もしくは、WebMをmp4に変換する方法を紹介していただけたら助かります。
よろしくお願いします。
参考ページ:
https://qiita.com/niisan-tokyo/items/fa6ff649a9a3312148bc
コード:
Javascript
1 var video = document.getElementById('video')// 適当にvideoタグのオブジェクトを取得 2 var constrains = { video: true, audio: true }// 映像・音声を取得するかの設定 3 navigator.mediaDevices.getUserMedia(constrains) 4 .then(function(stream) { 5 video.srcObject = stream // streamはユーザーのカメラとマイクの情報で、これをvideoの入力ソースにする 6 video.play() 7 }) 8 .catch(function(err) { 9 console.log("An error occured! " + err) 10 }) 11 // まずはユーザーのカメラ・マイクへのアクセスを実施 12 navigator.mediaDevices.getUserMedia(constrains) 13 .then(function (stream) { 14 recorder = new MediaRecorder(stream) // 映像の入力ソースをユーザーのデバイスから取得 15 recorder.ondataavailable = function (e) { 16 var testvideo = document.getElementById('test') 17 testvideo.setAttribute('controls', '') 18 testvideo.setAttribute('width', width) 19 testvideo.setAttribute('height', height) 20 var outputdata = window.URL.createObjectURL(e.data) // videoタグが扱えるように、記録データを加工 21 testvideo.src = outputdata // テスト用のビデオのソースに記録データを設置 22 } 23 }) 24 25 startbutton.addEventListener('click', function(ev){ 26 recorder.start() 27 ev.preventDefault() 28 }, false); 29 30 stopbutton.addEventListener('click', function(ev) { 31 recorder.stop() 32 }) 33 34 downloadbutton.addEventListener('click', function(ev) { 35 console.log(record_data) 36 var blob = new Blob(record_data, { type: 'video/webm' })// 録画ファイルをblob形式に出力 37 var url = window.URL.createObjectURL(blob) // データにアクセスするためのURLを作成 38 var a = document.createElement('a') // download属性を持ったaタグをクリックするとダウンロードができるので、それをシミュレートする 39 document.body.appendChild(a) 40 a.style = 'display:none' 41 a.href = url; 42 a.download = 'test.webm' 43 a.click() 44 window.URL.revokeObjectURL(url) 45 })
「Javascriptで録画をすると」の前提条件がわかりません。
具体的な保存方法を提示ください
>Javascriptで録画をするとWebMという形式で保存されてしまいます
実現しているコードを提示してください。
もしかして、この記事の方法ですか?
https://blog.ver001.com/javascript-canvas-mediarecorder/
以下の記事を参考にして書いています。
https://qiita.com/niisan-tokyo/items/fa6ff649a9a3312148bc
他にも以下の記事も見てみましたが、解決しなかったため質問させていただきました。
https://qiita.com/miyataku/items/6ed855a7fb7507ccc244
https://html5experts.jp/mganeko/12475/
https://reminder.ysrock.com/2018/01/16/%E3%82%A6%E3%82%A7%E3%83%96%E3%82%AB%E3%83%A1%E3%83%A9%E3%81%AE%E6%98%A0%E5%83%8F%E3%82%92%E9%8C%B2%E7%94%BB%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/
type: 'video/webm'
'test.webm'
って自身で書かれてますね
StackoverFlowの回答曰く、以下の形式にしか対応していないとのことでしたので、仕方がなく「video/webm」と書いていました。
ここを「video/mp4」とすると対応していないとエラーがでます。
対応形式(https://stackoverflow.com/questions/44392027/webrtc-convert-webm-to-mp4-with-ffmpeg-js)
"video/webm"
"video/webm;codecs=vp8"
"video/webm;codecs=vp9"
"video/webm;codecs=h264"
"video/x-matroska;codecs=avc1"
上記のページの回答に、以下のコードを書くとmp4で保存できると書いていますが、「.mp4」保存してみたところデータがうまく再生できませんでした。
ちなみに、拡張子を.webmにすると再生できました。
【コード】
var options = {mimeType: 'video/webm;codecs=h264'};
mediaRecorder = new MediaRecorder(stream, options);
.....
//Before merging blobs change output mime
var blob = new Blob(recordedBlobs, {type: 'video/mp4'});
// And name your file as video.mp4
おそらく、現段階では、拡張子や、コーデックは対応したものにできても、
本質的な動画の形式が、mp4に落とし込めないのでしょう。
これは、ブラウザなどのテクノロジーの時点での限界なので、
無理かと思いますよ。
まぁ、強いて方法と言えば、
mp4のバイナリデータの解析と、
Blobクラスの中身解析して、
オリジナルで、mp4書き出しアルゴリズムを作成する、とかでしょうかね。
めちゃくちゃ時間かかりそうですが。
もしくは、サーバーサイドでの技術だったら、ありそうな気がするので、
API提供してるサイトなどを探す、とかですね。
miyabi_takatsukさん
無理ですか...残念です。
他のAPIなどを探してみようと思います!
回答ありがとうございます。
> 以下のコードを書くとmp4で保存できる
コメントにありますけどこれは「~.mp4」というファイル名のwebmファイルができるだけのようですね。
動画再生ソフトはしばしば誤った拡張子のファイルも正常に再生できてしまうのでそれで勘違いしたのではないかと思います。
(というかh.264のwebmなんてあったんですね…)
コーデックがh.264にできているならコンテナをwebmからmp4に変換するのはそう難しい処理ではないと思いますが、ブラウザ上で完結するライブラリなどは見つけられませんでした。一応「javascript mp4 mux」で検索するとそれらしきものが少々見つかったりはしますが。
ikadzuchiさん >
ですよね。
やはり、なんかのAPI探す方が現実的くさいですよね・・・。
あなたの回答
tips
プレビュー