2009-03-30 5 views
1

Wir haben einen AS3-Player, der Flash 10 (um alte Probleme mit 9 und Wiedergabe Offsets zu überwinden) benötigt, um Clipping von Audio zu behandeln. Wenn ich Start- und Endpunkte für die Wiedergabe wähle, stimmt die Wiedergabe oft nicht mit dem Clip überein, der in Audacity abgespielt wird. Hier sind einige Details zu meinem Test mp3 (Ergebnisse von ffmpeg).Actionscript Tonwiedergabe Genauigkeit in Flash 10

libavutil  49.10. 0/49.10. 0 
libavcodec 52. 0. 0/52. 0. 0 
libavformat 52.22. 1/52.22. 1 
libavdevice 52. 1. 0/52. 1. 0 
libswscale  0. 6. 1/0. 6. 1 
libpostproc 51. 2. 0/51. 2. 0 
built on Sep 24 2008 15:49:57, gcc: 4.2.4 (TDM-1 for MinGW) 
Input #0, mp3, from 'reagan_challenger.mp3': 
Duration: 00:00:14.62, start: 0.000000, bitrate: 127 kb/s 
Stream #0.0: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s 

ursprüngliche URL: http://ericmalone.net/test_media/reagan_challenger.mp3

Abgeschnittene url: http://ericmalone.net/test_media/reagan_clipped.wav

Clip auf dem Backend erstellt wurde ffmpeg mit dem Clip von 4017ms zu bekommen - 7400ms:

ffmpeg -i reagan_challenger.mp3 -ss 4.017 -t 3.383 reagan_clipped.wav 

Ich habe auch abgeschnitten die Datei mit Audacity zu den etwas weniger genauen Positionen 4.017676 Sekunden - 7.401333 Sekunden bei http://ericmalone.net/test_media/reagan_challenger_from_audacity.wav

Hier ist der begrenzten Abschnitt über den Code der Wiedergabe angezeigt unten http://ericmalone.net/test_media/SoundExample.swf

Beachten Sie, dass das Wort Herausforderer schließt im Flash-Wiedergabe, aber die Dreistigkeit und ffmpeg basierte Schnittgut abgeschnitten wird in beiden.

Die Methode, mit der wir die Audiowiedergabe im Flash stoppen, ist ziemlich Standard. Ich habe die Sound-Bits zu einer Testklasse extrahiert. Hier ist der entsprechende Code

Also die Frage ist, gibt es einen besseren Weg, um genauere Wiedergabe von innerhalb Flash zu erhalten? Kommt es auf Codec/Abtastrate/etc?

Antwort

2

nicht direkt die richtige MP3-Encoding bezüglich könnte aber helfen ...

Sie müssen sich bewusst sein, die Timer-Klasse eine gewisse Präzision Marge hat.

Der Test in Ihrem Beispiel klang gut für mich (kein Klick in der Mitte) und ich kam 0,2% nahe an das gewünschte Ergebnis, das ist durchaus akzeptabel IMO.

den Code Bezug gibt es ein Detail, das ich auf, von Ihrem Beispiel gegeben die folgende Bedingung holen wollte:

clipEnd - song.position < timerInterval

Stellen Sie sich folgendes Szenario vor:

  • Der Timer bei 20 ms läuft Intervall, von 0 bis 7400
  • Die vorletzte Zecke landet auf 7381 vorrückend um 1ms
  • Die Sou nd wird bei 99,74% gestoppt

Wenn die Bedingung nicht abgesagt hatte ich denke, es bei 7401 (100.01%) versuchen Sie sollten

Vielleicht wie etwas aufgehört haben würde (Vorsicht, Blind codiert):

if(song.position >= clipEnd || (clipEnd - song.position < (song.position + timerInterval) - clipEnd)) 
{ 
    // Stop Timer 
} 

Die Verzögerung hängt von dem Code ab, den Sie ausführen, dem Computer usw.aber ich schlage vor, mit verschiedenen Intervallwerten zu spielen, um die beste "Gleichmäßigkeit" zu erreichen.

Stellen Sie außerdem sicher, dass Sie keine anderen Methoden zur Verzögerung der Ausführung des Timer-Ereignisses haben. Dazu sollten Sie diesen Timer-Teil wahrscheinlich isolieren, um ihn zu benchmarken (den Ton ebenfalls zu entfernen).

+0

Der Timer ist eigentlich kein großes Problem. Wenn Sie das swf-Beispiel hören, werden Sie hören, dass Reagan das Wort "Herausforderer" vervollständigt. Die Wiedergabe endet normalerweise um 7407 ms. Wenn Sie jedoch das mp3 mit ffmpeg oder Audacity bis zu 7400 (link oben) abschneiden, wird ein bedeutender Teil des Wortes abgeschnitten. – er1234

Verwandte Themen