0

バックグラウンドで再生できる音声のみのプレーヤーをアプリに入れようとしています。最初は 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", 分, 秒]];

4

1 に答える 1

0

FFMPEG のオーディオのみのセグメンテーションが正しく機能しませんでしたが、GIT リポジトリのヘッドで修正されました。MPMoviePlayer コントローラーの使用は今では完璧に機能し、セグメント サイズのステップですばやく見つけることができます。

于 2012-07-16T12:11:20.860 に答える