2012-03-28 3 views
0

Ich habe eine Menge Probleme, die gesamte Sample-Länge eines MP3 zu bekommen.Erhalten Sie die Gesamtlänge von Samples von Audio in Flash

Auch, wenn ich in die mp3 laden, spielt es nicht den ganzen Weg durch. Es spielt ungefähr die Hälfte seiner Länge.

Das mp3, das ich teste, kann hier gefunden werden, http://bit.ly/GYSOYj.

Der Code, den ich mit dem Sound zu spielen ist:

[Embed(source='assets/ffmangun_loop_79393.mp3')] 
private var _snd_class:Class; 
private var sound:Sound = new _snd_class as Sound; 


protected function application1_creationCompleteHandler(event:FlexEvent):void { 

    sound.length; // 600; 
    sound.bytesTotal;// 44652 

    soundChannel = sound.play(); 
    soundChannel.addEventListener(Event.SOUND_COMPLETE, soundComplete); 
} 

aktualisieren: es
Es wurde vorgeschlagen, dass ich die MP3 statt einbetten zu laden. Das Ergebnis ist, dass die MP3 die volle Länge spielt und die Länge und die Bytesumme nun unterschiedliche Nummern sind.

// Embedded Values ​​
Bytes gesamt = 44652
Tonlänge = 600,8163265306122

// Last dynamische Werte
Bytes gesamt = 44678
Tonlänge = 1776,3265306122448

aktualisieren
Dies muss zur Laufzeit festgestellt werden.

+0

Sie scheinen die gleiche Variable 'SampleDuration' zu überschreiben, es sei denn, das ist in der Zukunft doc erlaubt? – Neil

+0

Tritt dies auch auf, wenn Sie die Datei nicht einbetten, aber laden? – TheSHEEEP

+0

@Neil - das ist ein Tippfehler. Ich habe das entfernt. –

Antwort

3

Zuerst "totale Samples"! = Sound.bytesLoaded! = Sound.length. Sie sind alle sehr unterschiedlich.

Im folgenden Code habe ich einige andere Event-Listener eingefügt, um die Unterschiede zu veranschaulichen. Das Anhören von 'Event.SOUND_COMPLETE' wird Ihnen nicht viel sagen, zuerst einmal, weil es nur ausgelöst wird, wenn der Ton nicht mehr gespielt wird, und zweitens, weil es sich als sehr unzuverlässig erwiesen hat. Die Verwendung von Event.OPEN sagt Ihnen auch nicht viel, da die Datei noch nicht geladen wurde und keine Informationen abgerufen oder berechnet werden können. Sie können entweder ein ProgressEvent- oder ein EnterFrame-Ereignis verwenden, um das Laden des Sounds zu überwachen und die length -Eigenschaft zu lesen. Um jedoch die Gesamtzahl der Samples zu ermitteln, müssen Sie auch wissen, welche Sample-Rate für die Erstellung der MP3- und MPEG-Dateien verwendet wurde ob es Stereo oder Mono ist. Sobald Sie diese Dinge wissen, können Sie leicht die Stichprobenlänge der Datei durch Multiplizieren der Länge mit der Abtastrate erhalten.

Hoffentlich Anwendungsbeispiel hilft -

import flash.net.URLRequest; 
import flash.events.Event; 
import flash.media.Sound; 
import flash.media.SoundChannel; 

var sound:Sound; 
var soundChannel:SoundChannel; 
var sampleRate:Number = 44.1; 
var totalSamples:int; 

init(); 
function init():void { 
    sound = new Sound(); 
    sound.load(new URLRequest("http://bit.ly/GYSOYj")); 
    sound.addEventListener(Event.OPEN, soundOpen); 
    sound.addEventListener(Event.COMPLETE, soundComplete); 

    soundChannel = sound.play(); 
    soundChannel.addEventListener(Event.SOUND_COMPLETE, scComplete); 
} 
function soundOpen(e:Event):void{ 
    trace("OPEN:", sound.length); 
} 

function soundComplete(e:Event):void{ 
    trace("COMPLETE:", sound.length); 

    totalSamples = sound.length * sampleRate; 
    trace("SAMPLES", totalSamples); 
} 

function scComplete(e:Event):void{ 
    trace("sound is complete"); 
} 

edit: wie vorgeschlagen, eine as3swf nutzen konnte (bit.ly/HdhVcW) - aber nur können Sie entscheiden, ob es sich lohnt oder nicht. Kann mir nicht vorstellen, was Sie versuchen zu bauen, dass all dies benötigen würde.

+0

Danke - Sie sagten, "Sie müssen auch wissen, welche Sample-Rate verwendet wurde, um die MP3 zu erstellen und ob es Stereo oder Mono ist". Ich schätze, dass diese Informationen zur Laufzeit nicht verfügbar sind. –

+0

Nein, sicher nicht. Sie können die ByteArrays immer vergleichen, während sie wiedergegeben werden oder so, es gibt immer Möglichkeiten, die benötigten Informationen zu erhalten. :) – NHubben

+0

OK. Sie würden denken, dass Flash diese Information haben würde. Naja.Ich überprüfte online und fand einen indirekten Weg, diese Werte mit as3swf, http://bit.ly/HdhVcW zu bekommen. Wenn Sie in Ihrer Antwort einen Link zu dieser Seite hinzufügen, markiere ich Ihre Antwort als Antwort. –