HTML 5视频无法播放

4

我有一个简单的表单,用户可以输入名称并提交。当用户输入用户名时,在 iframe 中自动播放视频。当用户点击提交时,我希望打开一个新页面,其中包含一个视频,当用户点击提交时,视频应该自动播放。

目前为止,我已经完成以下工作:

表单页面 HTML。

<!DOCTYPE html>
<html>

<head>
    <title>Wideo iframe</title>
    <!-- Website Font style -->
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO"
        crossorigin="anonymous">

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.1/css/font-awesome.min.css">
    <!-- Google Fonts -->
    <link href='https://fonts.googleapis.com/css?family=Passion+One' rel='stylesheet' type='text/css'>
    <link href='https://fonts.googleapis.com/css?family=Oxygen' rel='stylesheet' type='text/css'>
    <link rel="stylesheet" href="./css/style.css">
    <link rel="stylesheet" href="./css/form.css">

</head>

<body>

    <iframe id="videoframe" src="videoframe.html"></iframe>
    <br />
    <div class="container">
        <div class="row main">
            <div class="main-login main-center">
                <h5>WYP: Formularz.</h5>
                <form id="formData" name="contact" role="form" method="post" action="thankspage.html" target="_blank">

                    <div class="form-group">
                        <label for="name" class="cols-sm-2 control-label">Imie</label>
                        <div class="cols-sm-10">
                            <div class="input-group">
                                <span class="input-group-addon"><i class="fa fa-user fa" aria-hidden="true"></i></span>
                                <input type="text" class="form-control" name="name" id="name" placeholder="Enter your Name" />
                            </div>
                        </div>
                    </div>

                    <input type="submit" id="button" value="submit" class="btn btn-primary btn-lg">


                </form>
            </div>
        </div>
    </div>



</body>
<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy"
        crossorigin="anonymous"></script>
<script src="js/form.js" type="text/javascript"></script>

</html>

这里是form.js。

//form script

        $(document).ready(function () {
            $(window).resize(resizeIframe);
            $(window).resize();

            //play a video when user enter aa name
            $("input#name").on("change", function () {
                document.getElementById('videoframe').contentWindow.postMessage( "event=fieldchanged&fieldtype=" + "name" + "&value=" + $("input#name").val(), "*");
            });

            // play a video when a user clicks submit button this is not working !!!!!!!
            $("#button").on("click", function(){
              document.getElementById('videoframe').contentWindow.postMessage(
                  JSON.stringify({
                    event: 'submitSlide()'
                  }), "*")

            })


        });

        function resizeIframe() {
            console.log($("iframe#videoframe").width()*576/1024 );
            $("iframe#videoframe").height( $("iframe#videoframe").width()*576/1024 );

        }

这里是videogframe.js。
   var autoplay = true;


   var movieName1 = "./videos/videoplayback.mp4"
   var movieThanks = "./videos/darasa.mp4"



   function resizeFunction() {
       $("#videowrapper").height($("#videowrapper").width() * 576 / 1024);

   }

   window.addEventListener("message", receiveMessage, false);

   function receiveMessage(eventPosted) {

       var values = eventPosted.data.split("&");
       var event = values[0].split("=")[1];
       var fieldtype = values[1].split("=")[1];
       var value = values[2].split("=")[1];

       console.log(event, fieldtype, value);

       switch (event) {
           case "fieldchanged":

               switch (fieldtype) {

                       case "name":
                       openSlide("nameSlide", {
                           value: value
                       });

                       case  "submit":
                       openSlide("submitSlide", {
                           value: value,

                       });
                       break;

                   default:
                       break;
               }
               break;
           default:
               console.log("Event not supported");
               break;
       }

   }

   function openSlide(slideName, params) {
       switch (slideName) {
               case "nameSlide":
               openName(params);
               break;

               case "submitSlide":
               openSubmit(params);
               break;
       }

   }

   var params = null;

   function openName(_params) {
    playVideo(movieName1);
   }
   function  openSubmit(_params){
     playVideo(movieThanks);
   }


 // function top play video
   function playVideo(src) {

       $("#playervideo").attr("src", src);
       $("#playervideo")[0].muted = false;


       if (autoplay == true) {

           var playPromise = $("#playervideo")[0].play();

           if (playPromise !== undefined) {

               playPromise.then(function () {}).catch(function () {

                   if (autoplay == true) {
                       $("#video-unmute-button").addClass("show");
                       $("#playervideo")[0].muted = true;
                       var playPromise2 = $("#playervideo")[0].play();

                       playPromise2.then(function () {

                       }).catch(function () {
                           $("#video-start-button").addClass("show");


                           $("#video-start-button").on("click", function () {
                               $("#playervideo")[0].muted = false;
                               $("#playervideo")[0].play();
                               $("#video-start-button").removeClass("show");

                           });
                       });

                       console.log("pause force");
                   } else {

                   }
               });
           } else {}
       } else {

       }

   }

这里是视频帧的HTML页面。
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Wideo iframe</title>
    <script src="https://code.jquery.com/jquery-3.3.1.js"></script>
    <link rel="stylesheet" href="css/style.css">

</head>

<body>
    <div id="videowrapper">
        <video  id="playervideo" controls></video>
        <canvas id="videocanvas" width="1024" height="576"></canvas>
        <div id="testform"><input type="text"/></div>
    </div>
</body>
<script src="jslibs/howler.min.js"></script>
<script src="https://code.createjs.com/1.0.0/createjs.min.js"></script>
<script src="js/videoframe.js" type="text/javascript"></script>

</html>

我正在使用post message进行通信。

除了当我点击提交时,它只是打开一个新页面而不播放视频之外,一切都按预期工作。

更新:如果有人不明白我的意思,请往下看

这是我想做的repo:Video frame

只需克隆repo并运行名为formpage.html的页面,开始填写表单,您将自动播放视频,但是当您单击提交按钮时,它只会打开页面,但视频不会播放:请自己测试

更新:为了更具体,我想像这样添加事件监听器来使用post message。

  // play a video after the user click submit button
            $("input#button").on("click", function () {
                document.getElementById('videoframe').contentWindow.postMessage( "event=fieldchanged&fieldtype=" + "submit" + "&value=" + $("input#button").val(), "*");
            });

为什么我的视频无法播放?我做错了什么吗?谢谢。


1
你尝试过将muted属性设置为true来播放视频吗? - Nik
嗨,尼克,我现在会尝试一下。你也可以自己尝试,上面有仓库链接,只是一个简单的HTML JavaScript页面,只需克隆它并运行formpage.html,你就可以看到所有内容了。 - The Dead Man
如果您将mmuted设置为true,当您输入用户名时播放无声视频,那么这不会解决问题吗? - The Dead Man
1
您将无法自动播放未静音的视频。这是浏览器供应商政策,许多我们的客户无法理解,但许多用户对此表示感激。 - yunzen
@Red 好的,请给我一些时间,我正在创建它。 - The Dead Man
显示剩余3条评论
1个回答

2
问题实际上非常简单,它不起作用是因为您将视频标签放在thankspage.html的iframe标签内,删除iframe标签并添加静音标志即可解决问题。
所以将此更改为:
<iframe id="videoframe" src="videoframe.html">
  <video width="320" height="240" controls autoplay>
    <source src="./video/janusz.mp4" type="video/mp4">
  </video>
</iframe>

转化为:

<video width="320" height="240" controls autoplay muted>
    <source src="./videos/janusz.mp4" type="video/mp4">
</video>

这当然会破坏你的CSS,但是你可以通过将视频标签放置在一个div中并操作该div来轻松地调整其大小。如下链接所示:https://jsfiddle.net/8xfq9urh/

谢谢伊斯兰,我想在iframe内播放视频,因为它们将用于另一个域。删除该视频标记并添加事件监听器以发布消息,查看其他视频我是如何做到的,我希望能够实现相同的效果,但不幸的是我不知道如何使用提交按钮。 - The Dead Man
我尝试了类似这样的代码:$("input#button").on("onlick", function () { document.getElementById('videoframe').contentWindow.postMessage( "event" + "button" + "&value=" + $("input#button").val(), "*"); }); - The Dead Man
@user9964622,我的回答已经回应了你当前的问题,你在原始帖子中没有指定其他东西。你能否请问另一个问题,以解决你可能有的其他问题? - Alexandre Elshobokshy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接