Аудио декодирование Flash / Flex Speex для воспроизведения файла speex - PullRequest
5 голосов
/ 07 декабря 2011

Я хочу воспроизвести * .spx файлы, которые закодированы в Speex в Интернете.
Но я ничего не знаю о Flash / Flex или любом кодеке Flash Audio. После поиска в Google в течение целого дня я получил несколько решений, а именно:

  1. Сделайте что-нибудь, оборачивая файлы Speex контейнером FLV, потому что Speex может воспроизводиться только как аудиокодек в контейнере FLV.
    Теперь я могу воспроизводить FLX-файл SPX-Audio-Only во Flex, я использую netStream.play("audio-only-speex.flv"), но я не знаю, как обернуть Spx-файл контейнером FLV с помощью ActionScript.
    Любой пример проекта?

  2. Декодирование Spx с использованием AS.
    Я проверил всплывающие страницы, что они все декодировали OGG Vorbis, но не Speex: (
    http://barelyfocused.net/blog/2008/10/03/flash-vorbis-player
    http://www.exswap.com/?p=132
    http://mauft.com/2010/11/ogg-vorbis-in-flash
    Adobe также предоставляет библиотеку AS3 OggVorbis, портированную Alchemy:
    http://labs.adobe.com/wiki/index.php/Alchemy:Libraries

  3. FMS: выполнять потоковую передачу на сервере с использованием FMS или Red / Xuggle. Я никогда раньше не слышал о FMS, а также не уверен, может ли мой виртуальный хост поддерживать или нет ...

  4. Конвертируйте все файлы Spx в MP3.

Я думаю, что лучшее решение - это декодирование Spx в AS3. Да, я хотел бы сделать Spx Flash Player.

Итак, я скачал Speex Library с speex.org, установил Adobe Alchemy. После ./configure;make libspeex создайте libspeex / speex.c из libspeex.swc через Алхимию. тогда я не знаю, что делать дальше. Как я могу декодировать аудио speex с AS3?
Мой libspeex.swc: http://demo.0x123.com/libspeex.swc

В дополнение , следует ли мне переписать libspeex с использованием Alchemy API перед сборкой libspeex.swc?

Хотя я не профессионал в AS, но у меня есть сильная способность учиться. Любой совет будет высоко оценен, большое спасибо.

Ответы [ 2 ]

1 голос
/ 11 декабря 2011

Adobe, в частности, говорит, что пока не полагаться на Алхимию, поэтому нет официального способа сделать это на стороне клиента (насколько я знаю). Абсурдно, учитывая, что явно используется декодер speex.

Можете ли вы использовать триггерную версию Xuggle ffmpeg (http://code.google.com/p/xuggle-ffmpeg/) для встраивания speex в FLV? Если вы можете запускать xuggle в пакетном режиме или на лету, то независимо от исходного аудиоформата вы можете подавать закодированный speex FLV, воспроизводимый с netStream.play.

ffmpeg -i test.wav -acodec libspeex -f flv -y speex.flv

Для базового воспроизведения вам даже не понадобится флэш-медиа-сервер.

0 голосов
/ 12 декабря 2011

Теперь я знаю, что должен переписать библиотеку speex с использованием API-интерфейса Alchemy:
http://labs.adobe.com/wiki/index.php/Alchemy:Documentation:Developing_with_Alchemy:C_API
http://labs.adobe.com/wiki/index.php/Alchemy:Documentation:Developing_with_Alchemy:AS3_API

Я сделал простой helloWorld. Это первый шаг, который хлопотно. :)

main.C

#include <stdio.h>
#include "AS3.h"

static AS3_Val addNumber(void* self, AS3_Val args)
{
        double num1 = 0.0;
        double num2 = 0.0;

        AS3_ArrayValue( args, "DoubleType, DoubleType",
                       &num1, &num2);

        double sum = num1 + num2;
        return AS3_Number(sum);
}

static AS3_Val helloString(void* self, AS3_Val args)
{
        char *str = "Hello, Alchemy!";
        return AS3_String(str);
}


int main ()
{

        // define the methods exposed to ActionScript
    // typed as an ActionScript Function instance
    AS3_Val addNumberMethod = AS3_Function(NULL, addNumber);
        AS3_Val helloStringMethod = AS3_Function(NULL, helloString);

    // construct an object that holds references to the functions
    AS3_Val result = AS3_Object("addNumber: AS3ValType, helloString: AS3ValType",
                                    addNumberMethod,
                                    helloStringMethod);

    // Release
    AS3_Release(addNumberMethod);
        AS3_Release(helloStringMethod);

    // notify that we initialized -- THIS DOES NOT RETURN!
    AS3_LibInit(result);

    // should never get here!
    return 0;

}


скомпилировать, используя $ main.c -O3 -Wall -swc -o HelloAlchemy.swc

AS код:

        import cmodule.HelloAlchemy.CLibInit;
        import mx.controls.Alert;

        private var loader:CLibInit;
        private var lib:Object;

        private function init():void
        {
            loader = new CLibInit;
            lib = loader.init();
        }
        protected function button1_clickHandler(event:MouseEvent):void
        {
            Alert.show(String(lib.addNumber(Number(3),Number(5)))); 
        }

        protected function helloStringButton_ClickHandler(event:MouseEvent):void
        {
            var str:String = String(lib.helloString());
            Alert.show(str);
        }
...