كيفية تشغيل صوت MP3 من المخزن المؤقت (ByteArray/Stream) في ActionScript 3؟

StackOverflow https://stackoverflow.com/questions/1619773

سؤال

لذا..انا املك المخزن المؤقت مع بيانات MP3 (إذا كنت سأحفظ هذا المخزن المؤقت وأطلق عليه اسم buffer.mp3 فسيتم تشغيله، لكن في هذه الحالة لا ينبغي لي حفظه في نظام الملفات). يجب أن ألعبها ولكن لا أستطيع، ماذا أفعل؟


لقد جربت الكود التالي لتشغيل هذا المخزن المؤقت (ByteArray\Stream) (أحصل على بيانات MP3 من الخادم، طريقة الحصول على البيانات تعمل بشكل جيد (تم اختبارها على text int's وما إلى ذلك) أتصل بـ ByteArray readResponse الذي تم إرجاعه لأن لدي بعض طرق الإغلاق وهو كذلك إنه رد).

            protected function Play(event:MouseEvent):void
        {
            var mySound:Sound = new Sound();
            mySound.addEventListener(SampleDataEvent.SAMPLE_DATA, soundFill);
            mySound.play(); 
        }

        public function soundFill(event:SampleDataEvent):void
        {
            event.data.writeBytes(readResponse.buffer, 0, readResponse.buffer.length);  
        }
هل كانت مفيدة؟

المحلول

لا يعمل هذا نظرًا لأن SampleDataEvent.data تتوقع بيانات عينة أولية غير مضغوطة، وليس MP3.يستخدم http://wiki.github.com/claus/as3swf/play-mp3-directly-from-bytearray بدلاً من.

نصائح أخرى

لا أعتقد أن هناك حلًا لبيانات mp3 الثنائية، لكن إذا كانت صيغة wav، فيجب أن ينجح هذا:


   private function loaded(event:Event):void {
   var urlStream:URLStream = event.target as URLStream;
   bArr = new ByteArray();
   urlStream.readBytes(bArr, 0);
   /**
    * Remove wav header here
    */
   bArr.position = 0;
   sampleMP3.addEventListener(SampleDataEvent.SAMPLE_DATA, sampleDataHandler);
   soundChannel = sampleMP3.play();
  }

  private function sampleDataHandler(event:SampleDataEvent):void {
   var bytesToRead:int = (bArr.bytesAvailable > 65536 ? 65536 : bArr.bytesAvailable);
   event.data.writeBytes(bArr, bArr.position, bytesToRead);
   bArr.position += bytesToRead;
  }

تذكر إزالة رأس wav قبل أخذ عينات البيانات.كما أنه يعمل بشكل جيد فقط عندما يكون معدل العينة 44.1 كيلو هرتز.بالنسبة لمعدلات العينات الأخرى، تحتاج إلى تكرار العينات أو إزالتها يدويًا لجعلها تشبه 44.1 كيلو هرتز.انتبه إلى الأصوات الأحادية، حيث تحتاج إلى توفير عينات من القناة اليسرى واليمنى إلى Flash، وبالتالي تحتاج إلى تكرار العينات.

نقطة البداية الجيدة هي فئة WavDecoder داخل حزمة Popforge's audio.format.wav.

يعمل التالي بالنسبة لي:

package
{
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.SampleDataEvent;
 import flash.media.Sound;
 import flash.media.SoundChannel;
 import flash.net.URLRequest;
 import flash.net.URLStream;
 import flash.utils.ByteArray;

 public class QuickSoundTest extends Sprite
 {
  public var sampleMP3:Sound;
  private var soundChannel:SoundChannel; 
  public var bArr:ByteArray;

  public function QuickSoundTest()
  {
   sampleMP3 = new Sound();

   var urlReq:URLRequest = new URLRequest("test.mp3");
   var urlStream:URLStream = new URLStream();
   urlStream.addEventListener(Event.COMPLETE, loaded);
   urlStream.load(urlReq);

  }

  private function loaded(event:Event):void {
   var urlStream:URLStream = event.target as URLStream;
   bArr = new ByteArray();
   urlStream.readBytes(bArr, 0, 40960);
   sampleMP3.addEventListener(SampleDataEvent.SAMPLE_DATA, sampleDataHandler);
   soundChannel = sampleMP3.play();
  }

  private function sampleDataHandler(event:SampleDataEvent):void {
   event.data.writeBytes(bArr, 0, 40960);
  }
 }
}

قد تحتاج إلى التحقق مما تم تخزينه في readResponse ByteArray أو كيفية قراءة البيانات عند تحميلها.التأكد من تحميل URLLoader باستخدام URLLoaderDataFormat.BINARY أو فقط باستخدام URLStream كما فعلت هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top