Flash 处理音频文件中提示点的最佳方式(从麦克风)

Flash 处理音频文件中提示点的最佳方式(从麦克风),flash,air,metadata,microphone,cue,Flash,Air,Metadata,Microphone,Cue,我想从麦克风录制音频,我希望用户能够在录制过程中添加提示点,这样当他加载文件后,他可以轻松地跳到特定位置 我真的不知道应该使用什么文件格式以及如何存储元数据(提示点) 我想到 对wav/mp3进行编码,并将元数据存储在.cue文件中(操作简单,但需要存储2个文件) 将XMP数据存储在mp3文件中(似乎有点困难,但标准元数据嵌入到1个文件中) 只有音频和标准提示点的flv/f4v,但我不确定是否可以直接从客户端创建它们 你觉得怎么样?在我看来,最好的方法是将SoundChannel.positio

我想从麦克风录制音频,我希望用户能够在录制过程中添加提示点,这样当他加载文件后,他可以轻松地跳到特定位置

我真的不知道应该使用什么文件格式以及如何存储元数据(提示点)

我想到

  • 对wav/mp3进行编码,并将元数据存储在.cue文件中(操作简单,但需要存储2个文件)
  • 将XMP数据存储在mp3文件中(似乎有点困难,但标准元数据嵌入到1个文件中)
  • 只有音频和标准提示点的flv/f4v,但我不确定是否可以直接从客户端创建它们

  • 你觉得怎么样?

    在我看来,最好的方法是将SoundChannel.position用户提示点保存到XML或类似的文件中。我知道这将输出两个文件,但您也可以创建自己的专有文件类型,并将音频数据+提示点NFO写入单个文件。无论如何,我这么说有几个原因。首先,为flash找到好的MP3编码器有点棘手。它们中的大多数都基于alchemy,这是一种预览技术(甚至不是beta版,只是简单地拼凑在一起的预览技术)。它也很容易出现内存泄漏、性能低下(flash程序员试图编写C/C++代码时,通常会管理不当或过载进程),而且很难找到一个功能完整的。我想说同样的情况也很可能适用于flash端的FLV/F4V编码。如果你想走这条路线,这是你最好的出发点:

    所以,如果真的要让你的项目以最快的速度完成并且运行最稳定,那么就使用2文件解决方案。如果你想的话,请不要误解我,有很多半成品或基本的MP3编码解决方案(以及上面提到的FLV),但学习这些文件格式、学习这些现有类/框架的工作方式、学习扩展它们,然后稳定和调试它们需要投入时间和精力。如果您想投入时间,那么请尽一切可能直接投入:。

    一个选项是将音频数据与提示点数据一起保存为XML文件中的文本。这将是一种非常低效的数据存储方式,并且会生成一个大文件,特别是如果是长时间记录的话。不过,使用MP3编码器/解码器或可对此有所帮助


    顺便问一下,我以前使用的Florian F.是吗?

    你知道WAV文件格式支持嵌入的线索块吗

    说:

    提示点块标识一系列位置
    波形数据流。定义如下:
    ->提示(//提示点的计数
    …)//提示点表
    ->结构{
    德沃德·德瓦姆;
    德沃德位置;
    福cc fccChunk;
    德沃德·德沃德;
    DWORD dwBlockStart;
    DWORD-dwSampleOffset;
    }
    
    对于具有单个数据块的WAV文件(标准),fccChunk应为“data”,chunkStart和blockStart为0,SampleOffset为要标记的样本


    这可能是记录提示的最便捷的方式。

    很好的建议。我想最后我会选择2文件解决方案。我可能会创建一个标准的提示表而不是XML,因为它也可以被其他玩家读取(winamp、foobar等等)。感谢您为我指出关于现有MP3编码解决方案的各种问题,我没有想到这一点。除非有人提供更好的解决方案,否则您将获得+50分;-)是的,我发现了MicRecorder应用程序。它还不支持mp3编码,但修改它应该不会太困难。然而,MP3编码解决方案似乎并不稳定(参见另一个答案)。我不确定是否需要MP3编码,所以如果可以的话,我会坚持使用wav文件。如果需要MP3,那么我选择在服务器端对其进行编码并不是不可能的。我从你(有趣的)博客上认识你,但我认为我们还没有合作过;-)即使只使用ByteArray.writeObject(),也可以使用Base64编码将其保存到包含提示点数据的XML文件中。也许与gzip()一起,这是一个可行的解决方案?另外,您可以查看本机进程API,并尝试在命令行上使用类似LAME编码器的东西。该应用程序应该可以在Android手机上运行,我不确定是否可以调用本机进程…我不知道!考虑到最后我可能会将声音录制为wav文件,这可能是最好的选择,谢谢
    The <cue-ck> cue-points chunk identifies a series of positions in 
    the waveform data stream. The <cue-ck> is defined as follows:
    <cue-ck> -> cue( <dwCuePoints:DWORD> // Count of cue points
                     <cue-point>... ) // Cue-point table
    
    <cue-point> -> struct {
        DWORD dwName;
        DWORD dwPosition;
        FOURCC fccChunk;
        DWORD dwChunkStart;
        DWORD dwBlockStart;
        DWORD dwSampleOffset;
    }