çalışırken HLS akışından (video) Ses Çıkarma/Kaydetme AVPlayer kullanarak HLS akışlarını oynuyorum. Ayrıca bu akışları kullanıcı presleri kayıt düğmesi olarak kaydetmem gerekiyor. Kullandığım yaklaşım, ses ve videoyu ayrı ayrı kaydetmek ve ardından son videoyu yapmak için bu dosyayı birleştirmek. Ve uzak mp4 dosyaları ile başarılı.iOS
Ancak şimdi HLS (.m3u8) dosyaları için AVAssetWriter kullanarak video kaydedebiliyorum ancak ses kaydıyla ilgili sorunlarım var.
Ham ses verilerini işlemek ve bir dosyaya yazmak için MTAudioProccessingTap kullanıyorum. this makalesini takip ettim. Uzak mp4 sesini kaydedebiliyorum ancak HLS akışlarıyla çalışmaz. Başlangıçta ses parçalarını AVAssetTrack * audioTrack = [asset tracksWithMediaType: AVMediaTypeAudio] [0] kullanarak akıtamıyordum;
Ancak MTAudioProcessingTap'ı başlatmak için KVO'yu kullanarak audioTracks'ı ayıklayabildim.
-(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 = weakself.currentAudioTrackID;
weakself.audioTrack = audioAssetTrack;
/// Use this audio track to initialize MTAudioProcessingTap
}
}
@catch (NSException *exception) {
NSLog(@"Exception Trap ::::: Audio tracks not found!");
}
}];
}
}
Ben de iz değiştirilirse kontrol etmek TrackID takip ediyorum.
MTAudioProcessingTap'ı bu şekilde başlatıyorum.
-(void)beginRecordingAudioFromTrack:(AVAssetTrack *)audioTrack{
// Configure an MTAudioProcessingTap to handle things.
MTAudioProcessingTapRef tap;
MTAudioProcessingTapCallbacks callbacks;
callbacks.version = kMTAudioProcessingTapCallbacksVersion_0;
callbacks.clientInfo = (__bridge void *)(self);
callbacks.init = init;
callbacks.prepare = prepare;
callbacks.process = process;
callbacks.unprepare = unprepare;
callbacks.finalize = finalize;
OSStatus err = MTAudioProcessingTapCreate(
kCFAllocatorDefault,
&callbacks,
kMTAudioProcessingTapCreationFlag_PostEffects,
&tap
);
if(err) {
NSLog(@"Unable to create the Audio Processing Tap %d", (int)err);
NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain
code:err
userInfo:nil];
NSLog(@"Error: %@", [error description]);;
return;
}
// Create an AudioMix and assign it to our currently playing "item", which
// is just the stream itself.
AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];
AVMutableAudioMixInputParameters *inputParams = [AVMutableAudioMixInputParameters
audioMixInputParametersWithTrack:audioTrack];
inputParams.audioTapProcessor = tap;
audioMix.inputParameters = @[inputParams];
_audioPlayer.currentItem.audioMix = audioMix;
}
Ama Şimdi bu ses parçasına MTAudioProcessingTap geri aramaları "hazırlayın" ve "Süreç" ile adlandırılan asla.
AudioTrack ile ilgili sorun KVO'dan geçiyor muyum?
Şimdi, birisinin bana bu konuda yardımcı olması için gerçekten minnettar olurum. Ya da HLS Akımlarını kaydetmek için yazma yaklaşımını kullandığımı söyleyebilir miyim?
m3u8 dosyasını kullanarak mp4 dosyası oluşturmayı başardınız mı? –
@Milan Bunun için cevabı gönderdim. lütfen kontrol edin. –
Çok teşekkürler Sajad. –