首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >angularjs捕获音频和上传文件

angularjs捕获音频和上传文件
EN

Stack Overflow用户
提问于 2018-09-21 15:30:08
回答 1查看 1.3K关注 0票数 0

我正在构建一个web应用程序,您可以从浏览器中录制音频,然后将其上传到服务器,以便其他用户能够收听它,给您一个评估,纠正语言学习。

我有部分代码,但我不知道如何将它们组合在一起:

JS (录制音频的脚本-很好,跳过录制和停止按钮的部分):

代码语言:javascript
复制
navigator.mediaDevices.getUserMedia({audio:true})
.then(stream => {handlerFunction(stream)})

function handlerFunction(stream) {
    rec = new MediaRecorder(stream);
    rec.ondataavailable = e => {
        audioChunks.push(e.data);
        if(rec.state == "inactive") {

            let blob = new Blob(audioChunks, {type:'audio/mpeg-3'});
            recordedAudio.src = URL.createObjectURL(blob);
            recordedAudio.controls = true;

            var url = recordedAudio.src;
            var link = document.getElementById("download");
            link.href = url;
            link.download = 'audio.wav';
        }
    }
}

HTML部件创建控件:记录、停止,然后下载录制的音频:

代码语言:javascript
复制
<button id="record">Record</button>
<button id="stopRecord">Stop</button>
<p> <audio id="recordedAudio"></audio></p>
<div id="recordings"><a id="download"> Download</a></div>

然后,我有一个文件选择器和一个AngularJS指令来上传一个文件--在调用: doUploadFile()之后,该文件将到达控制器并被上传到服务器。

上传可以很好地选择文件,但我不知道如何将这两段代码组合在一起。

代码语言:javascript
复制
<form>
    <input type="file" file-model="uploadedFile">
    <button type="submit" ng-click="doUploadFile()">Upload</button>
</form> 

文件上传指令:

代码语言:javascript
复制
.directive('fileModel', ['$parse', function($parse) {
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
            var model = $parse(attrs.fileModel);
            var modelSetter = model.assign;

            element.bind('change', function() {
                scope.$apply(function() {
                    modelSetter(scope, element[0].files[0]);
                });
            });
        }
    };
}]);

我在这里想要实现的是:

  1. 录制完后会弹出一个按钮/链接
  2. 此链接与录制的音频文件相关联。
  3. 单击此按钮将调用doUploadFile()方法

如何修改代码,并将2件放在一起,以便我们可以上传后,直接录音是完成?

我还是AngularJS的新手,会很高兴你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2018-09-22 09:56:19

编辑

设法使它工作:删除了文件上传的表单。这个指令也不再需要了。我把录音和上传的代码放在一起。我在控制器中添加了一个FormData对象,并添加了blob。现在工作得很好。

代码语言:javascript
复制
var data = new FormData();


$scope.doUploadFile = function() {
    var url = "/uploadfile";

    var config = {
            transformRequest: angular.identity,
            transformResponse: angular.identity,
            headers : { 'Content-Type': undefined }
    }

    $http.post(url, data, config)
    .then(function(response) {
        $scope.uploadResult = response.data;
        data = new FormData();
    });
};

navigator.mediaDevices.getUserMedia({audio:true})
.then(stream => {handlerFunction(stream)})

function handlerFunction(stream) {
    rec = new MediaRecorder(stream);
    rec.ondataavailable = e => {
        audioChunks.push(e.data);
        if(rec.state == "inactive") {

            let blob = new Blob(audioChunks, {type:'audio/mpeg-3'});
            recordedAudio.src = URL.createObjectURL(blob);
            recordedAudio.controls = true;
            recordedAudio.autoplay = false;

            var url = recordedAudio.src;

            data.append('uploadfile', blob, "recording.wav");
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52446920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档