Показать сообщение отдельно
Старый 13.07.2011, 03:22
olkina вне форума Посмотреть профиль Отправить личное сообщение для olkina Найти все сообщения от olkina
  № 1  
Ответить с цитированием
olkina
 
Аватар для olkina

Регистрация: Apr 2004
Адрес: Ramat Gan, Israel
Сообщений: 30
По умолчанию запись звука с микрофона в iOS и Android

Пишу приложение для iPad и Adroid планшетов, которое записывает звук с микрофона, а потом проигрывает его.

То, что замечательно работает на моем комьютере, ни в какую не согласно работать на планшетах.

Подробности:

Вот код, который начинает запись и ведет ее:

Код AS3:
		public function startRecording():void {
			if (Microphone.isSupported) {
				_isRecording = true;
				_microphone = Microphone.getMicrophone(Microphone.names[0]);
				_microphone.rate = 22;
				_microphone.gain = 100;
				_microphone.setSilenceLevel(0, 4000);
				_soundData = new ByteArray();
				_microphone.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleDataReceived);
			} else {
				trace("No microphone support!");
			}
		}
		protected function onSampleDataReceived(event:SampleDataEvent):void
		{
			while(event.data.bytesAvailable)
			{
				var sample:Number = event.data.readFloat();
				_soundData.writeFloat(sample);
			}
		}
На Android-e функция onSampleDataReceived не вызывается, видимо, event не приходит.

На iPad-е я нахожусь на более продвинутом этапе. SampleDataEvent приходит, _soundData явно содержит информацию (причем достаточно адекватную, чтобы нарисовать диаграмму звука), но проигрывать этот звук iPad отказывается. Максимум, что я могу услышать - несколько миллисекунд шума под конец.

Проигрываю звук я так:
Код AS3:
		public function playRecording():void {
			if (_soundData != null) {
				_soundData.position = 0;
				var sound:Sound= new Sound();
				sound.addEventListener(SampleDataEvent.SAMPLE_DATA, sound_sampleDataHandler);
				var channel:SoundChannel = sound.play();
				channel.addEventListener(Event.SOUND_COMPLETE, soundCompleteHandler);
			}
		}
 
		protected function sound_sampleDataHandler(event:SampleDataEvent):void
		{
			if (!_soundData.bytesAvailable > 0)
			{
				return;
			}
 
			for (var i:int = 0; i < 8192; i++)
			{
				var sample:Number = 0;
				if (_soundData.bytesAvailable > 0)
				{
					sample = _soundData.readFloat();
				}
				event.data.writeFloat(sample); 
				event.data.writeFloat(sample);  
			}
 
		}
		protected function soundCompleteHandler(event:Event):void
		{
			//some code
		}
Внимание, вопрос: кто-нибудь писал приложение, которое бы нормально работало с микрофоном на планшетах?

Upd: В app.xml доступ к миктофону, вроде, разрешен
Код:
<android>
        <manifestAdditions><![CDATA[
			<manifest android:installLocation="auto">
			    <!--See the Adobe AIR documentation for more information about setting Google Android permissions-->
			    <!--Removing the permission android.permission.INTERNET will have the side effect
		of preventing you from debugging your application on your device-->
			    <uses-permission android:name="android.permission.INTERNET"/>
			   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
			    <!--<uses-permission android:name="android.permission.READ_PHONE_STATE"/>-->
			    <!--<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>-->
			    <!--The DISABLE_KEYGUARD and WAKE_LOCK permissions should be toggled together
		in order to access AIR's SystemIdleMode APIs-->
			    <!--<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>-->
			    <!--<uses-permission android:name="android.permission.WAKE_LOCK"/>-->
			    <!--<uses-permission android:name="android.permission.CAMERA"/>-->
			    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
			    <!--The ACCESS_NETWORK_STATE and ACCESS_WIFI_STATE permissions should be toggled
		together in order to use AIR's NetworkInfo APIs-->
			    <!--<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>-->
			    <!--<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>-->
			</manifest>
			
		]]></manifestAdditions>
    </android>


Последний раз редактировалось olkina; 13.07.2011 в 03:40. Причина: добавила подробности и запятые