Phonegap Media API – Запись и воспроизведение аудио – Android

Я надеюсь записать некоторые аудио, а затем есть возможность воспроизвести его. Для меня важно настроить интерфейс записи .

В приведенном ниже примере после записи я получаю продолжительность -1, и звук не воспроизводится.

Шаг 1. Добавлен плагин Media

cordova plugin add org.apache.cordova.media 

Шаг 2. Мой код

Примечание. Src является «amr», как указано в документах.

Устройства Android записывают аудио в формате Adaptive Multi-Rate. Указанный файл должен заканчиваться расширением .amr.

Тем не менее, «myrecording.amr» не существует в моей файловой структуре, так как я надеюсь, что он будет создан.

Javascript

 var data = { rec: "" }; $scope.record = function(){ console.log('record'); var src = "myrecording.amr"; data.rec = new Media(src, function() { console.log("recordAudio():Audio Success"); }, function(err) { console.log("recordAudio():Audio Error: "+ err.code); }); data.rec.startRecord(); } $scope.stopRecording = function(){ console.log('stop'); data.rec.stopRecord(); } $scope.playRecording = function(){ console.log('play'); data.rec.play(); } $scope.logDuration = function(){ console.log(data.rec.getDuration()); } 

HTML

 <button ng-click="record()">Record</button> <button ng-click="stopRecording()">Stop Record</button> <button ng-click="playRecording()">Play Record</button> <button ng-click="logDuration()">Log Duration</button> 

Выход сверху

Когда я нажимаю кнопку воспроизведения, звук не воспроизводится.

 0 999846 log record 1 001845 log stop 2 002000 log recordAudio():Audio Success 3 004657 log play 4 008989 log -1 

Любая помощь будет принята с благодарностью. Дайте мне знать, могу ли я ответить на любые вопросы.

Solutions Collecting From Web of "Phonegap Media API – Запись и воспроизведение аудио – Android"

Вот мои шаги, чтобы заставить это работать.

1. Запустите эти команды

 ionic start RecordTest blank ionic platform add ios cordova plugin add org.apache.cordova.media 

2. Создайте RecordTest/www/myrecording.wav

3. Вставьте указанный ниже код в RecordTest/www/index.html

 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width"> <title></title> <link href="lib/ionic/css/ionic.css" rel="stylesheet"> <link href="css/style.css" rel="stylesheet"> <!-- IF using Sass (run gulp sass first), then uncomment below and remove the CSS includes above <link href="css/ionic.app.css" rel="stylesheet"> --> <!-- ionic/angularjs js --> <script src="lib/ionic/js/ionic.bundle.js"></script> <!-- cordova script (this will be a 404 during development) --> <script src="cordova.js"></script> <!-- your app's js --> <!-- <script src="js/app.js"></script> --> <script type="text/javascript" charset="utf-8"> // Wait for PhoneGap to load // document.addEventListener("deviceready", onDeviceReady, false); // Record audio // function recordAudio() { var src = "myrecording.wav"; var mediaRec = new Media(src, onSuccess, onError); // Record audio mediaRec.startRecord(); // Stop recording after 10 sec var recTime = 0; var recInterval = setInterval(function() { recTime = recTime + 1; setAudioPosition(recTime + " sec"); if (recTime >= 3) { clearInterval(recInterval); mediaRec.stopRecord(); mediaRec.play(); } }, 1000); } // PhoneGap is ready // function onDeviceReady() { recordAudio(); } // onSuccess Callback // function onSuccess() { console.log("recordAudio():Audio Success"); } // onError Callback // function onError(error) { alert('code: ' + error.code + '\n' + 'message: ' + error.message + '\n'); } // Set audio position // function setAudioPosition(position) { document.getElementById('audio_position').innerHTML = position; } </script> </head> <body ng-app="starter"> <ion-pane> <ion-header-bar class="bar-stable"> <h1 class="title">Ionic Blank Starter</h1> </ion-header-bar> <ion-content> <title>Device Properties Example</title> <!-- <script type="text/javascript" charset="utf-8" src="phonegap-1.4.1.js"></script> --> <p id="media">Recording audio...</p> <p id="audio_position"></p> </ion-content> </ion-pane> </body> </html> 

4. Запустите ionic emulate ios

Вышеизложенное должно работать.

Примечание: расширение изменяется в зависимости от платформы, которую вы разрабатываете для

Я работаю с чем-то похожим с ionicframworkf и плагинами для телефонной связи. Я создаю Record Factory для:

StartRecord, stopRecord, playRecord и Сохранить запись на сервер … Это мой заводский файл:

  /** * Record service * @module record * @author Claudio A. Marrero * @class famvoice */ services.factory('$record', [ '$rootScope', '$socket', '$account', function($rootScope, $socket, $account) { var enumerator = 0; var recordName = 'record-'+enumerator+'.mp3'; var mediaRec = null; var OnCallback = null; var OnAppendData = {}; /** * Start a record * * @method startRecord */ function startRecord(){ enumerator++; recordName = 'record-'+enumerator+'.mp3'; mediaRec = new Media(recordName, function() { }, function(err) { }); mediaRec.startRecord(); } /** * Stop record * * @method stopRecord */ function stopRecord(){ mediaRec.stopRecord(); } /** * Stop record * * @method stopRecord */ function playRecord(){ mediaRec.play(); } /** * Get the name of the record * * @method getRecord */ function getRecord(){ return recordName; } /** * Save the recorded file to the server * * @method save */ function save(callback,appendData){ OnCallback = callback; OnAppendData = appendData; window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, OnFileSystem, fail); } /** * Callback for setting the file system to persistent. * * @method OnFileSystem */ function OnFileSystem(fileSystem){ fileSystem.root.getFile(recordName, null, OnGetFile, fail); } /** * Callback for geting the file for disk * * @method OnGetFile */ function OnGetFile(fileEntry){ fileEntry.file(OnFileEntry, fail); } /** * Callback for file entry, this get the file. * * @method OnFileEntry */ function OnFileEntry(file){ var reader = new FileReader(); reader.onloadend = function(evt) { var image = evt.target.result; var base64Data = image.replace(/^data:audio\/mpeg;base64,/, ""); base64Data += base64Data.replace('+', ' '); $socket.emit('playlists:file',{file:base64Data,name:recordName, token: $account.token(), info:OnAppendData},OnCallback); }; reader.readAsDataURL(file); } /** * When any process of saving file fail, this console the error. * * @method OnFileEntry */ function fail(err){ console.log('Error'); console.log(err); } /** * Play record * * @method playRecord */ function playRecord(){ var mediaFile = new Media(recordName, function() { console.log("playAudio():Audio Success"); }, function(err) { console.log("playAudio():Audio Error: "+err); } ); // Play audio mediaFile.play(); } return { start: startRecord, stop: stopRecord, play:playRecord, name:getRecord, save:save }; }]); 

Мой проект находится на GitHub, если вы хотите проверить, как я реализую эту фабрику:

https://github.com/cmarrero01/famvoice

Вам нужно будет проверить ветку разработки.

Надеюсь, это вам полезно. 🙂

PH: Я замечаю этот вопрос по запросу кода, но я не хороший английский. 🙂