2017-02-03 28 views
2

iphoneでAVPlayerを使用してオーディオファイルを再生したい。オーディオファイルは、デバイスのローカルストレージからmp3ファイルです。私はそれ(再生されたファイル)を外部の時間ソースと同期させる必要があります。この時間ソースは再生中に変更される可能性がありますので、時々同期が必要になります。私が再生されるオーディオファイルの時間を変更するには、次のコードを使用:avplayer seekでオーディオファイルの位置が正しく表示されない

player.play() 

//sth here...... 


//the code which is executed periodically whene it is time to synchronize 
let currentShowTime = ...... //time in miliseconds 
print("current show time \(currentShowTime)") 
let timescale = player.currentItem!.asset.duration.timescale 
let currentTime = CMTime(value:Int64(Float64(currentShowTime!) * Float64(timescale)/1000.0), timescale:timescale) 

//alternative way I count the seek time but the effect is the same 
//let currentTime = CMTimeMakeWithSeconds(Float64(currentShowTime!)/1000.0, 1000) 

print("currenttime \(currentTime)") 
player!.seek(to: currentTime,toleranceBefore:kCMTimeZero, toleranceAfter:kCMTimeZero){done in 
    print("done: \(done)")               
    print("player currenttime \(self.player!.currentItem!.currentTime().seconds)") 
} 

問題は、オーディオファイルが間違った場所を再生しているということです。すべてのパラメータ:現在のショータイム、現在のタイム、プレーヤーの現在のタイムアウトは同じです(同じ値を出力します)。しかし、音が変わったと聞きました。ファイルの先頭が再生されるとき、シフトは小さく(おそらく500ms)、終了(ファイルの20分)になるとシフトははるかに大きくなる(約8秒)。私はまた、私は小さいビットレートで)小さいmp3ファイルを提供するシフトが小さいことが気づいたが、ファイルがより良い品質でシフトが最大20秒です。 sthが間違っているのですか、またはAVPlayerのバグですか?

答えて

1

使用しているファイルがVBR(可変ビットレート)mp3ファイルであると仮定しています。 AVFoundationは、VBRファイルを介し追求に問題がある - それは

averageBitRate = totalBytes/duration 
offset = seekTime * averageBitRate 

を使用していますが、VBRはaverageBitRateのファイルに対して、ファイル全体で一定ではないので、offsetが誤算することができます。

mp3を一定のビットレートで再エンコードする必要があります。

+1

ありがとうございました!それでおしまい! – user7509906

関連する問題