バックグラウンドで再生できる音声のみのプレーヤーをアプリに入れようとしています。最初は MPMoviePlayerController を使用していましたが、問題なく動作しましたが、前方および後方への検索 (またはスライダーの使用) がサポートされていないことが問題でした。
一部の録音は 1 時間の長さで、途中で中断されて元の場所に戻りたい場合は、最初からやり直す必要があります。AVAudioCoder を使用することが解決策のように思えたので、コードを変更して、デバイス上にない URL では機能しないことを発見しました。
私は Http Live Streaming を使用しており、.m3u8 ファイルを持っています。スライダーを使用して再生場所を変更する機能を備えた、インターネット ソースからの .m3u8 および .mp3 ファイルを使用するソリューションを簡単に実装できますか。(バックグラウンドで再生する必要があるため、MPMoviePlayerController のインターフェイスを使用できません)
更新: MPMoviePlayerController の使用に戻りましたが、奇妙な動作がいくつかありました。.m3u8 プレイリストを再生し、新しい位置を設定すると、 currentPlaybackTime のクエリ時に指定された値が正しい値に設定されますが、サウンドは中断されていないかのように再生され続けます。
プレーヤーを一時停止すると、それを無視して再生を続ける時間を設定しますが、少なくとも「currentPlaybackTime」は正しい現在位置を示します。
id appDelegate = (iDomsAppDelegate *)[[UIApplication sharedApplication] デリゲート]; double length = [[appDelegate audioPlayer] duration]; if(長さ > 0){ float スライダー値 = [_スライダー値]; 倍の時間 = スライダー値 / 100 * 長さ;
NSTimeInterval playBackTime = time;
NSLog(@"Requested time: %f vs current time %f", playBackTime, [[appDelegate audioPlayer] currentPlaybackTime]);
//[[appDelegate audioPlayer] pause];
[[appDelegate audioPlayer] setCurrentPlaybackTime:playBackTime];
//[[appDelegate audioPlayer] setInitialPlaybackTime:playBackTime];
//[[appDelegate audioPlayer] play];
NSLog(@"Requested time: %f vs current time %f (2)", playBackTime, [[appDelegate audioPlayer] currentPlaybackTime]);
}
毎秒ラベルを更新すると、上記のような動作が得られます。
id appDelegate = (iDomsAppDelegate *)[[UIApplication sharedApplication] デリゲート];
double time = [[appDelegate audioPlayer] currentPlaybackTime]; double length = [[appDelegate audioPlayer] duration]; NSLog(@"State: %i, Time: %f", [[appDelegate audioPlayer] playbackState], [[appDelegate audioPlayer] currentPlaybackTime]); if(length > 0){ double pos = 時間/長さ * 100; [_slider setValue:(float)pos]; [_slider setEnabled:true];
NSInteger seconds = (int) length % 60;
NSInteger minutes = ((int) length / 60) % 60;
double playableDuration = [[appDelegate audioPlayer] playableDuration];
if(playableDuration > 0 && playableDuration < length){
int downloaded = (int)((float)((float)playableDuration / (float)length) * 100);
[_unknownLength setText:[NSString stringWithFormat:@"Total duration: %02i:%02i (%02i%% downloaded)", minutes, seconds, downloaded]];
} else {
[_unknownLength setText:[NSString stringWithFormat:@"Total duration: %02i:%02i", minutes, seconds]];
}
} else { [_slider setEnabled:false]; [_unknownLength setText:[NSString stringWithFormat:@"Total duration unknown"]];
}
NSInteger 秒 = (int) 時間 % 60; NSInteger 分 = ((int) 時間 / 60) % 60; [_position setText: [NSString stringWithFormat:@"%02i:%02i", 分, 秒]];