获取使用 `Sound` 对象下载的 mp3 文件的原始数据
get the raw data of mp3 file which is downloading with the `Sound` object
我动态创建了Sound
对象
var files:Object={};
files["file1"]={};
files["file1"]["snd"]=new Sound();
...... //url etc
files["file1"]["snd"].addEventListener(ProgressEvent.PROGRESS, onLoadProgress);
function onLoadProgress(event:ProgressEvent):void
//// somehow I need to get the raw data (first 48 bytes to be exact) of the mp3 file which is downloading now
}
我在那个函数中尝试了URLRequest
var myByteArray:ByteArray = URLLoader(event.target).data as ByteArray;
但没有成功
搞笑的是,文件数据这么简单的东西竟然这么难搞定
flash.media.Sound
是高级 class 允许您在一行中播放声音文件 : new Sound(new URLRequest('your url')).play();
但不提供 public 访问正在播放的数据已加载
class 将为您处理流式传输(更准确地说,渐进式下载)
如果需要访问id3数据,监听Event.ID3事件即可:
var sound:Sound = new Sound("http://archive.org/download/testmp3testfile/mpthreetest.mp3");
sound.addEventListener(Event.ID3, onId3);
sound.play();
function onId3(e:Event):void {
var id3:ID3Info = (e.target as Sound).id3;
trace(id3.album, id3.artist, id3.comment, id3.genre,
id3.songName, id3.track, id3.year);
}
如果你真的需要获取原始的前 48 个字节并自己处理它们,但请记住你将不得不处理各种 mp3 格式 id3/no id3,并直接处理二进制数据,而不是让 actionscript 为您完成工作。
假设你不想下载 mp3 文件两次,你可以:
使用 URLLoader 将 mp3 文件加载为 ByteArray,手动读取 48 个字节,并从内存中加载 Sound 实例,从而失去任何渐进式下载能力。 :
var l:URLLoader = new URLLoader;
l.dataFormat = URLLoaderDataFormat.BINARY;
l.addEventListener(Event.COMPLETE, onComplete);
l.load(new URLRequest("http://archive.org/download/testmp3testfile/mpthreetest.mp3"));
function onComplete(e:Event):void {
//do whatever you need to do with the binary data (l.data)
// ...
// load sound from memory
new Sound().loadCompressedDataFromByteArray(l.data, l.data.length);
您还可以以 classic 方式加载使用声音 class(以允许渐进式下载),并使用 URLStream 独立加载前 48 个字节,并且尽快关闭流(只有一个网络开销数据包,而且你可能会从缓存中获取它):
var s:URLStream = new URLStream;
s.addEventListener(ProgressEvent.PROGRESS, onStreamProgress);
s.load(new URLRequest("http://archive.org/download/testmp3testfile/mpthreetest.mp3"));
function onStreamProgress(e:ProgressEvent):void {
if (s.bytesAvailable >= 48) {
// whatever you need to do with the binary data: s.readByte()...
s.close();
}
}
我仍然很想知道您为什么需要那 48 个字节?
编辑:因为应该将 48 个字节提供给 MP3InfoUtil,所以您不需要做任何特别的事情,只需让 lib 完成工作即可:
MP3InfoUtil.addEventListener(MP3InfoEvent.COMPLETE, yourHandler);
MP3InfoUtil.getInfo(yourMp3Url);
我动态创建了Sound
对象
var files:Object={};
files["file1"]={};
files["file1"]["snd"]=new Sound();
...... //url etc
files["file1"]["snd"].addEventListener(ProgressEvent.PROGRESS, onLoadProgress);
function onLoadProgress(event:ProgressEvent):void
//// somehow I need to get the raw data (first 48 bytes to be exact) of the mp3 file which is downloading now
}
我在那个函数中尝试了URLRequest
var myByteArray:ByteArray = URLLoader(event.target).data as ByteArray;
但没有成功
搞笑的是,文件数据这么简单的东西竟然这么难搞定
flash.media.Sound
是高级 class 允许您在一行中播放声音文件 : new Sound(new URLRequest('your url')).play();
但不提供 public 访问正在播放的数据已加载
class 将为您处理流式传输(更准确地说,渐进式下载)
如果需要访问id3数据,监听Event.ID3事件即可:
var sound:Sound = new Sound("http://archive.org/download/testmp3testfile/mpthreetest.mp3");
sound.addEventListener(Event.ID3, onId3);
sound.play();
function onId3(e:Event):void {
var id3:ID3Info = (e.target as Sound).id3;
trace(id3.album, id3.artist, id3.comment, id3.genre,
id3.songName, id3.track, id3.year);
}
如果你真的需要获取原始的前 48 个字节并自己处理它们,但请记住你将不得不处理各种 mp3 格式 id3/no id3,并直接处理二进制数据,而不是让 actionscript 为您完成工作。 假设你不想下载 mp3 文件两次,你可以:
使用 URLLoader 将 mp3 文件加载为 ByteArray,手动读取 48 个字节,并从内存中加载 Sound 实例,从而失去任何渐进式下载能力。 :
var l:URLLoader = new URLLoader; l.dataFormat = URLLoaderDataFormat.BINARY; l.addEventListener(Event.COMPLETE, onComplete); l.load(new URLRequest("http://archive.org/download/testmp3testfile/mpthreetest.mp3")); function onComplete(e:Event):void { //do whatever you need to do with the binary data (l.data) // ... // load sound from memory new Sound().loadCompressedDataFromByteArray(l.data, l.data.length);
您还可以以 classic 方式加载使用声音 class(以允许渐进式下载),并使用 URLStream 独立加载前 48 个字节,并且尽快关闭流(只有一个网络开销数据包,而且你可能会从缓存中获取它):
var s:URLStream = new URLStream; s.addEventListener(ProgressEvent.PROGRESS, onStreamProgress); s.load(new URLRequest("http://archive.org/download/testmp3testfile/mpthreetest.mp3")); function onStreamProgress(e:ProgressEvent):void { if (s.bytesAvailable >= 48) { // whatever you need to do with the binary data: s.readByte()... s.close(); } }
我仍然很想知道您为什么需要那 48 个字节?
编辑:因为应该将 48 个字节提供给 MP3InfoUtil,所以您不需要做任何特别的事情,只需让 lib 完成工作即可:
MP3InfoUtil.addEventListener(MP3InfoEvent.COMPLETE, yourHandler);
MP3InfoUtil.getInfo(yourMp3Url);