我正在使用AVPlayer播放HLS流.而且我还需要在用户按下记录按钮时记录这些流.我使用的方法是分别录制音频和视频,然后在最后合并这些文件以制作最终视频.并且它对远程mp4文件很成功.
但是现在对于HLS(.m3u8)文件,我能够使用AVAssetWriter录制视频,但是录音有问题.
我正在使用MTAudioProccessingTap处理原始音频数据并将其写入文件.我跟着这篇文章.我能够录制远程mp4音频,但它无法使用HLS流.最初我无法使用AVAssetTrack*audioTrack = [asset tracksWithMediaType:AVMediaTypeAudio] [0]从流中提取音轨.
但我能够使用KVO提取audioTracks来初始化MTAudioProcessingTap.
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
AVPlayer *player = (AVPlayer*) object;
if (player.status == AVPlayerStatusReadyToPlay)
{
NSLog(@"Ready to play");
self.previousAudioTrackID = 0;
__weak typeof (self) weakself = self;
timeObserverForTrack = [player addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(1, 100) queue:nil usingBlock:^(CMTime time)
{
@try {
for(AVPlayerItemTrack* track in [weakself.avPlayer.currentItem tracks]) {
if([track.assetTrack.mediaType isEqualToString:AVMediaTypeAudio])
weakself.currentAudioPlayerItemTrack = track;
}
AVAssetTrack* audioAssetTrack = weakself.currentAudioPlayerItemTrack.assetTrack;
weakself.currentAudioTrackID = audioAssetTrack.trackID;
if(weakself.previousAudioTrackID != weakself.currentAudioTrackID) {
NSLog(@":::::::::::::::::::::::::: Audio track changed : %d",weakself.currentAudioTrackID);
weakself.previousAudioTrackID …Run Code Online (Sandbox Code Playgroud)