【问题标题】:Web Audio With Multiple Streams具有多个流的网络音频
【发布时间】:2017-09-19 06:04:20
【问题描述】:

我正在尝试通过基于 RESTful 的 Web 服务流式传输音频。我的音频文件包含两个不同的 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();
};

这适用于流式传输初始音频,并且与我使用 &lt;audio&gt; 标签一样。

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

以下是 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

【问题讨论】:

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


    【解决方案1】:

    目前最简单的方法是使用 MediaSource 扩展。 https://developer.mozilla.org/en-US/docs/Web/API/MediaSource

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

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

    【讨论】:

    • 我现在的问题是我不知道如何获取这些单独的块。我的服务只返回许多音频文件之一。嵌入在这些音频文件中的是两个流。通过以下链接,我可以了解如何缓冲加载整个文件。但是本文档中没有任何地方指定或给出在一个文件中包含两个音频流的示例。除非我错过了什么。
    • @cain4355 这些文件的容器格式是什么?你能提供ffmpeg -i yourfile的输出吗?
    • 我将我的 ffmpeg 结果添加到我的原始帖子中
    • @cain4355 没有在 JavaScript 中解复用 MP4,我认为您要做的就是将它们拆分为单独的文件。我怀疑很快(一年内),这将不再是必要的(对于现代浏览器),因为我们将获得对多个音轨的适当支持。您可以使用 ffmpeg -i audioExample.m4a -map 0:0 -c:a copy audioExample-track-0.m4a 或类似的东西将它们分开。
    • 如何在 JavaScript 中解复用 MP4?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多