سؤال

لديّ برنامج نصي لتسجيل MIC يعمل في AS3 والذي تمكنت من استخدامه بنجاح لحفظ ملفات .wav إلى خادم من خلال AMF. تشغيل هذه الملفات بشكل جيد في أي مشغل صوت بدون تأثيرات غريبة.

للرجوع إليها ، إليك ما أفعله لالتقاط الميكروفون Bytearray: (ضمن فئة تسمى AudioreCorder)

public function startRecording():void {
_rawData = new ByteArray();
_microphone
 .addEventListener(SampleDataEvent.SAMPLE_DATA,_samplesCaptured, false, 0, true);
}

private function _samplesCaptured(e:SampleDataEvent):void {
  _rawData.writeBytes(e.data);
}

هذا يعمل بدون مشاكل. بعد اكتمال التسجيل ، يمكنني أخذ متغير _rawdata وتشغيله من خلال فئة WavWriter ، إلخ.

ومع ذلك ، إذا قمت بتشغيل هذا نفس BYTEARRAY كصوت باستخدام الكود التالي الذي قمت بتكييفه من كتاب طبخ Adobe: (ضمن فئة تسمى Wavplayer)

public function playSound(data:ByteArray):void {
  _wavData = data;
  _wavData.position = 0;
  _sound.addEventListener(SampleDataEvent.SAMPLE_DATA, _playSoundHandler);
  _channel = _sound.play();
  _channel
    .addEventListener(Event.SOUND_COMPLETE, _onPlaybackComplete, false, 0, true);
}

private function _playSoundHandler(e:SampleDataEvent):void {
  if(_wavData.bytesAvailable <= 0) return;
  for(var i:int = 0; i < 8192; i++) {
    var sample:Number = 0;
    if(_wavData.bytesAvailable > 0) sample = _wavData.readFloat();
    e.data.writeFloat(sample);
  }
}

يلعب ملف الصوت بسرعة مزدوجة! لقد راجعت تسجيل معدل البشر على هذا النحو ، وأنا متأكد من أن هذه كلها صحيحة ، وحاولت تغيير حجم المخزن المؤقت وأي أرقام أخرى يمكن أن أفكر فيها. هل يمكن أن يكون شيئًا مونوًا مقابل ستيريو؟

آمل أن أكون واضحا بما فيه الكفاية هنا ، شكرا!

هل كانت مفيدة؟

المحلول

المشكلة هي أن ByTearRay يجب أن تحتوي على بيانات لكلتا القنات (يسار واليمين) ، وهي قيمة واحدة بعد الأخرى مباشرة. هكذا، إذا كان التسجيل الخاص بك أحادي, ، يجب أن يكون الرمز الخاص بك:

for(var i:int = 0; i < 8192; i++) {
    var sample:Number = 0;
    if(_wavData.bytesAvailable > 0) sample = _wavData.readFloat();
        e.data.writeFloat(sample);
        e.data.writeFloat(sample);
}

إذا كان ستيريو ، فستحتاج إلى ضبط وفقًا لذلك.

نصائح أخرى

لقد اختبرته.
تحتاج إلى التأكد من أن معدل الميكروفون عند 44 كيلو هرتز:
_microphone.rate = 44 ؛
هذا يجب أن يبدو صحيحا.

إستعملت:

    private function playSound(data:ByteArray):void
    {
        rawData = data;
        rawData.position = 0;
        var sound:Sound = new Sound();
        sound.addEventListener(SampleDataEvent.SAMPLE_DATA, playSoundHandler);
        var channel:SoundChannel = sound.play();
        channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete, false, 0, true);
    }

    private function playSoundHandler(e:SampleDataEvent):void
    {
        if(rawData.bytesAvailable <= 0)
        {
            return;
        }
        for(var i:int = 0; i < 8192; i++)
        {
            var sample:Number = 0;
            if(rawData.bytesAvailable > 0)
            {
                sample = rawData.readFloat();
            }
            e.data.writeFloat(sample);
            e.data.writeFloat(sample);
        }
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top