blue-phoenix
@blue-phoenix

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

JavascriptにMP4を再生したいものの、自動機能が上手くいかない。

htmlとJavascriptでアプリを作っている者です・・・。今回、MP4ファイルをJSに
組み込んでその画面になったら自動再生、次画面へ
移るコードを書いているのですが上手くいきません。
そうしている理由は・・・ゲーム結果を映画的表現にしたくて作っています。
1-2.png

一生懸命作った映像を見せたいところですが、
動かないのでここでは無理そうです。
疑惑コードは以下の様になりますが、さすがに今回は少し長めです。
理解していただける方が現れるのを望みます。

html

<!-- ムービー画面 -->
<div id = "screen1" class = "movie-screen" style = "display: none;">
<video id = "video1" src = "video1.mp4" controls autoplay></video><br>
<button onclick = "goToEndScreen()">スキップ</button>
</div>

慎重に1から説明しなければ伝わらないと思うので書きます。
screen1を親要素としてclassで画像サイズ、styleで画像事前隠し。
一応buttonでムービー飛ばしボタンも入れてます。
video1で映像表示、controls + autoplayで自動再生にしたはずだが無効で。

Javascript

//ゲーム画面7(映画的画像)
function goToScreen1() {
changeScreen('game-screen7', 'screen1'); // 画面を切り替え
var video1 = document.getElementById('video1'); // ビデオ要素を取得
___
// ビデオ要素が存在するか確認
if (video1) {
video1.currentTime = 0;  // 動画を最初から再生
// ユーザーインタラクションがあった場合にビデオを再生
video1.play().then(() => {
// 15秒後にエンディング画面へ遷移
setTimeout(function() {
goToEndScreen();  // 関数呼び出し
}, 15000);
}).catch(function(error) {
console.error('ビデオの自動再生に失敗しました: ', error);
// エラーが発生した場合、即座に次の画面へ移動
setTimeout(function() {
goToEndScreen();  // 関数呼び出し
}, 15000);
});
} else {
console.error('ビデオ要素が見つかりません: id="video1"を確認してください。');
}
}

___
//ボタン押すコード
function goToEndScreen() {
fadeOut(document.getElementById('screen1'), function() {
fadeIn(document.getElementById('end-screen'));
});
}

ちょっと長いですがこの通りです。
結果画面のgame-screen7からvideo1につながるscreen1と
エンディングにつながるend-screenとして設定してます。
currentTimeを入れないと映像が途中から始まっちゃいます。
そして映像は14秒なので15秒にEDへ移るよう
setTimeoutを書いたはずですが、なぜか機能せず。
記入ミスがあるなら良いですが、映像だけは最後まで
映っています。率直に自動機能だけ動いていないので、
原因を特定できるか御教授お願いしたいです。
ここまで辿り着くまでにエラー、バグが頻繫に・・・
アプリ開発がこんなに難しいとは思わなかったです。
今回は今までよりコードが多くて戸惑いますが、
ここを越えれば山が見えてくると・・・内容が理解できる方・・・お願いいたします。

0

6Answer

1つ目のビデオは再生できるが、2つ目のビデオが自動再生できないということでよろしいでしょうか?

endedイベントで1つ目のビデオの終了を検知して、2つ目のビデオを再生する」、という方法で実装できそうです。

See the Pen Untitled by yotty (@yotty) on CodePen.

※ビデオは こちら からお借りしました。

1Like

Comments

  1. @blue-phoenix

    Questioner

    ビデオは1種類のみですね、いずれは複数種類入れる予定ですが、これは1つですら自動再生されないんです・・・次ページに移る機能すらもできなくて(・ω・`)

  2. 映像が途中から始まっちゃいます
    映像だけは最後まで映っています

    とありますが、再生はできるけど自動再生はできないという状態でしょうか…?


    ブラウザの仕様で、音の出る動画・音声は自動再生できないようになっています。
    動画などを再生させるためには、一度ユーザの操作が必要になります。

    ユーザの操作直後ではないタイミングで動画を再生したいのであれば、
    ユーザに一度タップなどの操作を促し、そのタイミングで非表示状態でループ再生、
    再生したいタイミングでcurrentTime=0にして非表示を解除する、といった工夫が必要になると思います。

  3. @blue-phoenix

    Questioner

    音は何も入っていないんです、それでも自動機能は無理でしょうか?
    ブラウザ元来の影響でできないとなると、もうMP4では作れないのか・・・。
    他のクリエイターの人達はスクロールバーもない、ミュート機能もないゲームのムービーシーンとかはどうやって作っているんでしょうかね?

  4. 先ほどのURLにある通り、ミュートでよければmuted属性を付与すれば自動再生できると思います。

    ブラウザゲームは大体ゲームを開始するときに、ゲーム内をクリックする必要があったりと、基本的に何かしらの操作させたうえで遊び始められるようになっていることがほとんどだと思います。

そこまでjsに詳しくないのですが
firefoxを使っていると自動再生がブロックされることがあります
またはchromeを使っていても拡張機能を入れている場合は自動再生がブロックされることがあります

0Like

Comments

  1. @blue-phoenix

    Questioner

    く、chromeだとダメなんですか!? 今、自分が使っているのはそれなんですけど・・・まいったな。

アルファベットは全角にしないで半角を使ってください

×: JavascriptにMP4を再生したいですが、
〇: JavaScript に MP4 を再生したいですが、

コードはインデントされるように Markdown 方式で書き直してください

そうしてもらえないと質問を読む気がしないという閲覧者はきっと自分だけではないはずです。

0Like

Comments

  1. @blue-phoenix

    Questioner

    できる限り書き直しておきます。

  2. できる限り書き直しておきます。

    対応ありがとうございます。

    ただ、一番目に付くタイトルの全角アルファベットが直ってないです。

    Markdown 方式については以下の記事を見てください。

じ、自動再生できました!!! これって・・・一体どんな仕組みで・・・?
が・・・次ページ自動切り替えは相変わらず無効になってます。
setTimeoutがどこかおかしいんでしょうか?

0Like

Comments

  1. setTimeoutは、動画終了後の処理として利用しようとしていますか?

    動画終了後になにか処理をしたければ、最初にお伝えしたとおりsetTimeoutではなくendedイベントを利用するのはいかがでしょうか?

  2. @blue-phoenix

    Questioner

    function goToScreen1() {
        changeScreen('game-screen7', 'screen1'); // 画面を切り替え
        var video1 = document.getElementById('video1'); // ビデオ要素を取得
    
        // ビデオ要素が存在するか確認
        if (video1) {
            video1.currentTime = 0;  // 動画を最初から再生
            video1.muted = true;     // ビデオをミュートにする(必要であれば)
            video1.play().catch(function(error) {
                console.error('ビデオの再生が失敗しました: ', error);
            });
    
            // ビデオ再生が終了したときに次の画面に移行
            video1.addEventListener('ended', function() {
                goToEndScreen();  // ビデオが終了したらエンディング画面に遷移
            });
        } else {
            console.error('ビデオ要素が見つかりません: id="video1"を確認してください。');
        }
    }
    

    書きましたがやっぱり画面が移りません・・・もう自動再生はできるように
    なりましたが、切り替えがやはり。htmlの方も書くべきコードがあるのでしょうか?
    スクリーンショット 2024-10-05 115155.png
    そういえば始まりの画面も下部のスクロールバーが自動で消えていました。
    ED画面に移るときも自動で消えるんでしょうか?
    それがendedコードかもしれないですけど・・・。

スクリーンショット 2024-10-05 145311.png

エンダアアアアァァウォアアアア、できたああああああああああああぁぁお!!!
自動でエンディングじゃあああああああ!!!

0Like

Comments

  1. @blue-phoenix

    Questioner

    //ゲーム画面7(映画的画像)
    document.getElementById("next-button7").addEventListener("click", function() {
    fadeOut(document.getElementById("game-screen7"), function() {
    goToScreen1();  // ここで関数を呼び出す
    });
    });
    function goToScreen1() {
    // ゲーム画面7からムービー画面へ切り替える処理
    fadeOut(document.getElementById('game-screen7'), function() {
    fadeIn(document.getElementById('screen1')); // ムービー画面を表示
    var video1 = document.getElementById('video1'); // ビデオ要素を取得
    if (video1) {
        video1.currentTime = 0;  // 動画を最初から再生
        video1.muted = true;     // ビデオをミュートにする
        video1.play().catch(function(error) {
        console.error('ビデオの再生が失敗しました: ', error);
    });
    // ビデオ再生が終了したらエンディング画面に遷移
        video1.addEventListener('ended', function() {
        goToEndScreen();  // エンディング画面へ
    });
    } else {
        console.error('ビデオ要素が見つかりません: id="video1"を確認してください。');
    }
    });
    }
    

    原因はあきれるほどのマヌケで、
    fadeOut(document.getElementById("game-screen7"), function() { を
    changeScreen('game-screen7', 'screen1'); と書いていた事でした。
    つまりチェンジスクリーンがきちんと読み込んでくれなかったので
    自動してくれなかったと。なんでdocument.getElementByIdの方が有効だったのか
    まったく理解・・・できません('・ω・`)

Your answer might help someone💌