5

我想在网络上播放由Speex编码的 *.spx 文件。
但我不了解 Flash/Flex 或任何 Flash 音频编解码器。谷歌搜索了一整天后,我得到了一些解决方案,即:

  1. 使用 FLV 容器包装 Speex 文件,因为 Speex 只能作为 FLV 容器中的音频编解码器播放。
    现在我可以在 Flex 中播放 SPX-Audio-Only FLV 文件,我使用netStream.play("audio-only-speex.flv"),但我不知道如何使用 ActionScript 用 FLV 容器包装 Spx 文件。
    任何示例项目?

  2. 使用 AS 解码 Spx。
    我查看了他们都解码 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
    Adob​​e 还提供了一个由 Alchemy 移植的 AS3 OggVorbis 库:http:
    //labs.adobe.com/wiki/index.php/Alchemy :图书馆

  3. FMS:使用 FMS 或 Red/Xuggle 进行服务器流式传输。我以前从未听说过FMS的东西,而且我不确定我的虚拟主机是否可以支持......

  4. 将每个 Spx 文件转换为 MP3。

我认为最好的解决方案是在 AS3 中解码 Spx,是的,我想做一个 Spx Flash Player。

所以,我从 speex.org 下载了 Speex Library,安装了 Adob​​e Alchemy。在./configure;makelibspeex 之后,通过 Alchemy 构建 libspeex/speex.c 出一个libspeex.swc。然后,我不知道下一步该怎么做。如何使用 AS3 解码 speex 音频?
我的 libspeex.swc:http ://demo.0x123.com/libspeex.swc

另外,我应该在构建 libspeex.swc 之前使用Alchemy API重写 libspeex 吗?

虽然我在AS方面不专业,但是我的学习能力很强。任何建议将不胜感激,非常感谢。

4

2 回答 2

1

Adobe 明确表示不要依赖 Alchemy,因此在客户端没有官方方法可以做到这一点(据我所知)。考虑到显然使用了 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

对于基本播放,您甚至不需要 Flash 媒体服务器。

于 2011-12-10T20:49:40.320 回答
0

现在我知道我必须使用 alchemy API 重写 speex 库:http://labs.adobe.com/wiki/index.php/Alchemy:Documentation:Developing_with_Alchemy: C_API
http://labs.adobe.com/wiki
/index.php/Alchemy:文档: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

作为代码:

        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);
        }
于 2011-12-12T03:00:59.117 回答