同步视频和音频(最好不使用JavaScript)

用户名

如果我有HTML5videoaudio元素,是否有一种干净的方法可以使它们保持同步?它们的行为应类似于包含音频轨道的视频文件,因此,手动前进一个轨道应将另一个轨道带入轨道。假设两条轨道的持续时间相同。

我想要一个适用于所有浏览器的解决方案,但是我不太在意它是否适用于较旧的浏览器。如果可能的话,最好避免使用JavaScript。否则,最好使用简陋的JavaScript库-仅要求同步哪些轨道并负责其余部分的事情。

我已经研究了mediagroup ……但是看起来它只能在Safari中使用。我研究了audioTracks ...,但是用户必须在Firefox中启用该功能。

我研究了Popcorn.js,它是一个似乎为该任务而设计的JavaScript框架...但似乎一年多来没有任何活动。除此之外,我能找到的唯一示例是将文本或幻灯片同步到视频,而不是音频到视频。

来宾271314

您可以使用Promise.all()fetch()以检索媒体资源BlobURL.createObjectURL()以创建Blob URL资源;canplaythrough事件并Array.prototype.every()检查每个资源是否可以播放;.play()当两个资源都可以播放时,调用每个资源

我没有在问题中弄清楚。我的意思是两条音轨应该保持同步,就好像播放带有音频的常规视频文件一样。

一种方法可能是创建一个时间戳变量,当设置变量大于最小延迟时利用seeked事件更新.currentTime元素以防止.currentTime被递归调用。

<!DOCTYPE html>
<html>
<head>
</head>
<body>
  <button>load media</button>
  <br>
  <div id="loading" style="display:none;">loading media...</div>
  <script>
    var mediaBlobs = [];
    var mediaTypes = [];
    var mediaLoaded = [];
    var button = document.querySelector("button");
    var loading = document.getElementById("loading");
    var curr = void 0;
    var loadMedia = () => {
      loading.style.display = "block";
      button.setAttribute("disabled", "disabled");
      return Promise.all([
        // `RETURN` by smiling cynic are licensed under a Creative Commons Attribution 3.0 Unported License
        fetch("https://ia600305.us.archive.org/30/items/return_201605/return.mp3")
      , fetch("http://nickdesaulniers.github.io/netfix/demo/frag_bunny.mp4")
        ])
        .then(responses => responses.map(media => ({
          [media.headers.get("Content-Type").split("/")[0]]: media.blob()
        })))
        .then(data => {
          for (var currentMedia = 0; currentMedia < data.length; currentMedia++) {
            (function(i) {
              var type = Object.keys(data[i])[0];
              mediaTypes.push(type);
              console.log(data[i]);
              var mediaElement = document.createElement(type);
              mediaElement.id = type;
              var label = document.createElement("label");
              mediaElement.setAttribute("controls", "controls");
              mediaElement.oncanplaythrough = () => {
                mediaLoaded.push(true);
                if (mediaLoaded.length === data.length 
                   && mediaLoaded.every(Boolean)) {
                    loading.style.display = "none";
                    for (var track = 0; track < mediaTypes.length; track++) {
                      document.getElementById(mediaTypes[track]).play();
                      console.log(document.getElementById(mediaTypes[track]));
                    }
                }
              }
              var seek = (e) => {
                if (!curr || new Date().getTime() - curr > 20) {
                  document.getElementById(
                    mediaTypes.filter(id => id !== e.target.id)[0]
                  ).currentTime = e.target.currentTime;
                  curr = new Date().getTime();
                }
              }
              mediaElement.onseeked = seek;
              mediaElement.onended = () => {
                for (var track = 0; track < mediaTypes.length; track++) {
                  document.getElementById(mediaTypes[track]).pause()
                }
              }
              mediaElement.ontimeupdate = (e) => {
                e.target.previousElementSibling
                .innerHTML = `${mediaTypes[i]} currentTime: ${Math.round(e.target.currentTime)}<br>`;
              }
              data[i][type].then(blob => {
                mediaBlobs.push(URL.createObjectURL(blob));
                mediaElement.src = mediaBlobs[mediaBlobs.length - 1];
                document.body.appendChild(mediaElement);
                document.body.insertBefore(label, mediaElement);
              })
            }(currentMedia));
          }
        })
    };
    button.addEventListener("click", loadMedia);
  </script>
</body>
</html>

plnkr http://plnkr.co/edit/r51oh7KsZv8DEYhpRJlL?p=preview

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Web抓取Javascript元素,最好不使用Selenium

来自分类Dev

使用OpenCV和PyAudio同步音频和视频

来自分类Dev

音频和视频不同步

来自分类Dev

提交后,PHP显示用户上传文件的内容(最好不使用mySQL)

来自分类Dev

无限期地重复一个函数,最好不使用setInterval()

来自分类Dev

填充任意形状的 numpy ndarray(最好不使用 for 循环)

来自分类Dev

从文件中将字符串加载到html中?最好不要使用JavaScript

来自分类Dev

Exoplayer,同步播放音频流和视频流吗?

来自分类Dev

WebRTC对等连接中的音频和视频如何保持同步?

来自分类Dev

Chrome中的Youtube音频和视频不同步

来自分类Dev

mp4文件使用mediacodec和mediamuxer时的音频和视频轨道同步问题

来自分类Dev

删除视频的音频流-递归地不使用FFMPEG转换音频或视频

来自分类Dev

AVCaptureMovieFile输出音频/视频同步

来自分类Dev

使用gstreamer合并音频和视频管道

来自分类Dev

使用FFmpeg录制音频和视频

来自分类Dev

使用ffmpeg交叉淡化视频和音频

来自分类Dev

FFMPEG与音频和视频并排使用

来自分类Dev

使用 gstreamer 捕获分段的音频和视频

来自分类Dev

Perl变量/正则表达式问题,如何在循环中使用存储正则表达式匹配,最好不使用哈希

来自分类Dev

使用 AVAssetWriter 损坏视频捕获音频和视频

来自分类Dev

如何使用JavaScript正确创建HTML5音频和视频

来自分类Dev

使用ffmpeg连接视频时音频/视频不同步:非单调TDS输出

来自分类Dev

使用ffmpeg合并音频和视频,并保留视频和音频语音

来自分类Dev

使用 ffmpeg 将视频文件与音频同步会返回一个没有音频的视频

来自分类Dev

如何将视频序列与音频同步

来自分类Dev

ffmpeg连接音频不同步的视频

来自分类Dev

Oracle 不使用最好的 dbplan

来自分类Dev

Directshow推送源过滤器,同步音频和视频流

来自分类Dev

HTML5 JavaScript中的Sycn音频和视频

Related 相关文章

  1. 1

    Web抓取Javascript元素,最好不使用Selenium

  2. 2

    使用OpenCV和PyAudio同步音频和视频

  3. 3

    音频和视频不同步

  4. 4

    提交后,PHP显示用户上传文件的内容(最好不使用mySQL)

  5. 5

    无限期地重复一个函数,最好不使用setInterval()

  6. 6

    填充任意形状的 numpy ndarray(最好不使用 for 循环)

  7. 7

    从文件中将字符串加载到html中?最好不要使用JavaScript

  8. 8

    Exoplayer,同步播放音频流和视频流吗?

  9. 9

    WebRTC对等连接中的音频和视频如何保持同步?

  10. 10

    Chrome中的Youtube音频和视频不同步

  11. 11

    mp4文件使用mediacodec和mediamuxer时的音频和视频轨道同步问题

  12. 12

    删除视频的音频流-递归地不使用FFMPEG转换音频或视频

  13. 13

    AVCaptureMovieFile输出音频/视频同步

  14. 14

    使用gstreamer合并音频和视频管道

  15. 15

    使用FFmpeg录制音频和视频

  16. 16

    使用ffmpeg交叉淡化视频和音频

  17. 17

    FFMPEG与音频和视频并排使用

  18. 18

    使用 gstreamer 捕获分段的音频和视频

  19. 19

    Perl变量/正则表达式问题,如何在循环中使用存储正则表达式匹配,最好不使用哈希

  20. 20

    使用 AVAssetWriter 损坏视频捕获音频和视频

  21. 21

    如何使用JavaScript正确创建HTML5音频和视频

  22. 22

    使用ffmpeg连接视频时音频/视频不同步:非单调TDS输出

  23. 23

    使用ffmpeg合并音频和视频,并保留视频和音频语音

  24. 24

    使用 ffmpeg 将视频文件与音频同步会返回一个没有音频的视频

  25. 25

    如何将视频序列与音频同步

  26. 26

    ffmpeg连接音频不同步的视频

  27. 27

    Oracle 不使用最好的 dbplan

  28. 28

    Directshow推送源过滤器,同步音频和视频流

  29. 29

    HTML5 JavaScript中的Sycn音频和视频

热门标签

归档