javascript - 具有多个流的网络音频

标签 javascript html5-audio audio-streaming web-audio-api

我正在尝试通过基于 RESTful 的网络服务流式传输音频。我的音频文件包含两个不同的 AAC 228 Kbps 立体声轨道。一个是英语,另一个是西类牙语。

我的 GET 请求返回音频文件没问题。但是,它默认为文件中的第一个来源(在本例中为西类牙语)。

最终,我希望最终用户能够使用浏览器并根据需要在音频源之间切换。我已经知道大多数浏览器目前不支持通过 HTML5 提供的 audioTracks API,我不希望将我的最终用户限制为 IE 或 Edge。

这让我开始使用 Web Audio API 来尝试手动操作流。

为了测试我当前的 HTML 只是一个播放按钮。

<md-button class="md-raised" ng-click="audioActions()">Audio options</md-button>

我现在的.js如下:

var context;

window.addEventListener('load', init, false);
function init() {
    try {
        // Fix up for prefixing
        window.AudioContext = window.AudioContext||window.webkitAudioContext;
        context = new AudioContext();
    }
    catch(e) {
        alert('Web Audio API is not supported in this browser');
    }
}

var onError = function() {
    $log.info("ERROR");
}

$scope.audioActions = function() {
    var request = new XMLHttpRequest();
    request.open('GET', 'http://localhost...', true);
    request.responseType = 'arraybuffer';

    // Decode asynchronously
    request.onload = function() {
        context.decodeAudioData(request.response, function(buffer) {
            $log.info(buffer)

            var source = context.createBufferSource();
            source.buffer = buffer;
            source.connect(context.destination);
            source.start(0);
        }, onError);
    }

    request.send();
};

这适用于流式传输初始音频,就像我使用 <audio> 一样标签。

有没有办法能够在缓冲区内的音频流之间切换?

下面是我文件中 ffmpeg -i 的转储:

[mov,mp4,m4a,3gp,3g2,mj2 @ 0000000000ea6920] stream 0, timescale not set
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'E:\ServerFiles\tmp\audioExample.m4a':
  Metadata:
    major_brand     : M4A
    minor_version   : 0
    compatible_brands: M4A mp42isom
    creation_time   : 1982-08-11T07:52:37.000000Z
    title           : Test
    artist          : Audio Example
    album_artist    : Audio Example
    album           : Example
    genre           : Test
    track           : 1/20
    disc            : 1/1
    compilation     : 0
    gapless_playback: 0
    date            : 2017-08-16T08:00:00Z
    account_id      : 
    rating          : 0
    account_type    : 0
    season_number   : 0
    episode_sort    : 0
    media_type      : 1
    purchase_date   : 2017-08-16 15:59:27
    sort_album      : Audio Example
    composer        : Example
  Duration: 00:02:59.00, start: 0.000000, bitrate: 160 kb/s
    Stream #0:0: Audio: aac (HE-AAC), 48000 Hz, stereo, fltp (default)
    Stream #0:1: Audio: aac (HE-AAC), 48000 Hz, stereo, fltp

最佳答案

目前执行您所要求的最简单方法是使用 MediaSource Extensions。 https://developer.mozilla.org/en-US/docs/Web/API/MediaSource

基本上,您缓冲数据,然后让浏览器解码 block 。当您想切换到其他内容时,只需开始从其他流中输入数据 block 进行解码即可。

这里有一个更好的例子:https://developers.google.com/web/fundamentals/media/mse/basics

关于javascript - 具有多个流的网络音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46292957/

相关文章:

javascript - HTML5 音频播放器,无法读取 null 的属性 'paused'

error-handling - 如何使用 AVPlayer 处理流媒体错误

javascript - 如何使用 javascript(node.js) 从 Microsoft Dynamics CRM 接收 webhook?

javascript - 弹出模式仅适用于angularjs中的第一项

javascript - 创建一个浏览器以在 ASP.NET 网页中加载网站

javascript - 每次单击按钮时旋转 div 元素

javascript - 非法调用jQuery HTML5音频播放

JavaScript 音频在使用同一音频对象时多次播放

cordova - 离线/断开连接几分钟后继续播放音频吗?

c++ - 如何使用 ffmpeg 解码 AAC 网络音频流