オーディオのクリッピングを処理するためにFlash 10(9の古い問題と再生オフセットを克服するため)が必要なAS3プレーヤーがあります。しかし、再生する開始点と終了点を選択すると、再生されるものがAudacityで再生されるものと同じクリップと何度も一致しません。私のテストmp3(ffmpegの結果)に関するいくつかの詳細は以下の通りです。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
オリジナルURL:http://ericmalone.net/test_media/reagan_challenger.mp3
クリップされたURL:http://ericmalone.net/test_media/reagan_clipped.wav
クリップが4017msからクリップを取得するためにffmpegのを使用してバックエンドで作成されました - 7400ms:
ffmpeg -i reagan_challenger.mp3 -ss 4.017 -t 3.383 reagan_clipped.wav
私がしましたAudacityを使用してファイルを少し小さく正確な位置にクリップしました。4.017676秒 - 7.401333秒(http://ericmalone.net/test_media/reagan_challenger_from_audacity.wav)
ここでフラッシュ再生にhttp://ericmalone.net/test_media/SoundExample.swf
お知らせ単語その挑戦者完了の下に表示されるコードを経由して再生するクリッピング部分は、ですが、Audacityはとffmpegのベースの切り抜きの両方に切り捨てられます。
フラッシュでオーディオ再生を停止する方法はかなり標準的です。私はサウンドクラスをテストクラスに抽出しました。ここでは、関連するコード
package {
import flash.display.Sprite;
import flash.events.*;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.net.URLRequest;
import flash.text.TextField;
import flash.utils.Timer;
public class SoundExample extends Sprite {
private var url:String = "http://www.ericmalone.net/test_media/reagan_challenger.mp3";
private var soundFactory:Sound;
private var song:SoundChannel;
private var clipStart:int = 4017;
private var clipEnd:int = 7400;
private var timer:Timer;
private var timerInterval:uint = 20;
private var textField:TextField;
public function SoundExample() {
var request:URLRequest = new URLRequest(url);
soundFactory = new Sound();
soundFactory.addEventListener(Event.COMPLETE, completeHandler);
soundFactory.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
soundFactory.load(request);
textField = new TextField();
textField.wordWrap = true;
textField.width = 500;
addChild(textField);
}
private function completeHandler(event:Event):void {
output("file completely loaded and playing");
timer = new Timer(timerInterval);
timer.addEventListener(TimerEvent.TIMER, onTimer);
song = soundFactory.play(clipStart);
timer.start();
}
private function ioErrorHandler(event:Event):void {
output("ioErrorHandler: " + event);
}
private function onTimer(event:TimerEvent):void
{
//stop playback if position is greater than clip end
//or if there's less duration left than difference of the timer and current position
if((song.position >= clipEnd || clipEnd - song.position < timerInterval))
{
timer.stop();
song.stop();
output("Ending playback at " + song.position + " to be as close to " + clipEnd + " as possible");
}
}
private function output(str):void
{
textField.text = str;
trace(str);
}
}
}
がそこで質問がされます、フラッシュの中から、より正確な再生を得るための良い方法はありますか?コーデック/サンプリングレート/などに依存しますか?
タイマーは実際にはあまり問題にはなりません。 swfの例を聞いてみると、レーガンが「挑戦者」という言葉を完成させたと聞こえます。通常、再生は約7407msで終了します。しかし、mp3をffmpegまたはAudacityで最大7400(上のリンク)までクリップすると、その単語のかなりの部分が途切れてしまいます。 – er1234