#ios #actionscript-3 #audio #air #bytearray
#iOS #actionscript-3 #Аудио #air #bytearray
Вопрос:
я создал небольшое тестовое приложение во Flash Pro 5.5, наложенное на AIR 3 sdk. имеет всего 2 кнопки для записи и воспроизведения звука с микрофона.
когда я тестирую это на своем iPhone 3g, я записываю себя, говоря «1-2-3-4-5». но когда я воспроизводю полсекунды или около того, в начале отсутствует: «3-4-5-«.
когда я тестирую это на рабочем столе, все в порядке
это результат мощности процессора iPhone 3g, ошибка или это мой код?
спасибо, Саар
если кто-нибудь может попробовать этот код и посмотреть, воспроизводит ли он это, я был бы признателен
это приложение:
все, что у меня есть на сцене, — это 2 прямоугольных видеоролика с именами «записано» и «проигрыватель», весь код находится в этом классе документа:
package {
import flash.display.MovieClip;
import flash.media.Microphone;
import flash.media.SoundMixer;
import flash.events.MouseEvent;
import flash.utils.ByteArray;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.events.SampleDataEvent;
import flash.media.AudioPlaybackMode;
public class RecTest extends MovieClip {
var mic:Microphone;
var nowRecording:Boolean = false;
var nowPlaying:Boolean = false;
var recordedBytes:ByteArray = new ByteArray();
var s:Sound = new Sound();
var sc:SoundChannel;
public function RecTest() {
mic = Microphone.getMicrophone(-1);
SoundMixer.useSpeakerphoneForVoice = true;
SoundMixer.audioPlaybackMode = AudioPlaybackMode.MEDIA;
mic.gain = 100;
mic.setSilenceLevel(0);
mic.rate = 44;
recorder.addEventListener(MouseEvent.CLICK, onRec);
player.addEventListener(MouseEvent.CLICK, onPlay);
}
function onRec(e:MouseEvent) {
if (nowRecording) {
trace("stopped");
mic.removeEventListener(SampleDataEvent.SAMPLE_DATA, getMicAudio);
nowRecording = false;
} else {
trace("recording");
recordedBytes.position = 0;
recordedBytes.length = 0;
mic.addEventListener(SampleDataEvent.SAMPLE_DATA, getMicAudio);
nowRecording = true;
}
}
function onPlay(e:MouseEvent) {
if (nowPlaying) {
trace("stopped");
sc.stop();
s.removeEventListener(SampleDataEvent.SAMPLE_DATA, playAudio);
nowPlaying = false;
} else {
trace("playing");
recordedBytes.position = 0;
s.addEventListener(SampleDataEvent.SAMPLE_DATA, playAudio);
sc = s.play();
sc.addEventListener(Event.SOUND_COMPLETE, onComplete,false,0,true);
nowPlaying = true;
}
}
function onComplete(e:Event) {
trace("stopped");
s.removeEventListener(SampleDataEvent.SAMPLE_DATA, playAudio);
nowPlaying = false;
}
function getMicAudio(e:SampleDataEvent) {
recordedBytes.writeBytes(e.data);
}
function playAudio(e:SampleDataEvent) {
for (var i:int = 0; i < 8092 amp;amp; recordedBytes.bytesAvailable > 0; i ) {
e.data.writeBytes(recordedBytes);
e.data.writeBytes(recordedBytes);
}
}
}
}
Ответ №1:
Я предлагаю вам использовать функцию прокрутки, чтобы начать запись. В качестве обходного пути вы можете начать запись, когда пользователь инициализирует жест салфетки. Надеюсь, запись начнется, когда жест будет завершен.
Если вы попробуете это — сообщите нам, как это работает
Ответ №2:
хорошо, похоже, это задержка в записи iOS. поэтому я использую обходной путь: постоянная запись в буфер и использование кнопок для записи входных и выходных позиций ByteArray для воспроизведения
Ответ №3:
Попробуйте прослушать flash.события.ActivityEvent-событие. Может возникнуть небольшая задержка перед фактическим началом записи микрофона.
Комментарии:
1. Спасибо. это нехорошо с точки зрения пользователя, поскольку он / она начинает говорить, как только нажимает кнопку. я отправлю сообщение об ошибке в Adobe. тем временем я использую обходной путь: постоянная запись в буфер и использование кнопок для записи входных и выходных позиций ByteArray для воспроизведения
2. Я не уверен, что это ошибка Adobe. Это происходит и в приложении голосовых заметок на моем iPhone (я нажимаю запись и сразу начинаю говорить, он пропускает мой «1» в «1-2-3-4»).
3. это хороший момент, хотя приложение air появилось значительно позже. кстати, на Android то же приложение немедленно начинает запись
Ответ №4:
Попробуйте получить записанный файл (вам нужно подключиться к iphone по ssh и получить файл в каталоге приложений) и посмотреть, есть ли задержка в записи или задержка в воспроизведении.
Комментарии:
1. тот факт, что мой обходной путь работает, на самом деле показывает, что это проблема записи, а не воспроизведения