2012-07-17 19 views
5

Bu sorunu iyi bir 48 saat boyunca çözmeye çalışıyorum ve hiçbir şeyle karşılaşmadım. Farklı http canlı akışlarını oynayan 2 AVPlayer nesnesim var. Açıkçası, ikisi de aynı anda ses çalmasını istemiyorum, bu yüzden videolardan birini kapatmanın bir yoluna ihtiyacım var. Bu işe ne zaman AVPlayer oynayan bir müzik parçası muting'in Elma suggests thisBir AVPlayer'da bir HTTP Canlı Akışı'nı kapatın

...

NSMutableArray *allAudioParams = [NSMutableArray array]; 
for (AVPlayerItemTrack *track in [_playerItem tracks]) { 
    if ([track.assetTrack.mediaType isEqualToString:AVMediaTypeAudio]) { 
     AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParameters]; 
     [audioInputParams setVolume:0.0 atTime:CMTimeMakeWithSeconds(0,1)]; 
     [audioInputParams setTrackID:[track.assetTrack trackID]]; 
     [allAudioParams addObject:audioInputParams]; 
     // Added to what Apple Suggested 
     [track setEnabled:NO]; 
    } 
} 

AVMutableAudioMix *audioZeroMix = [AVMutableAudioMix audioMix]; 
[audioZeroMix setInputParameters:allAudioParams]; 
[_playerItem setAudioMix:audioZeroMix]; 

(birçok tekrarlamalar sonra), ben AVPlayerItemTrack enabled özelliğini buldu ve HAYIR için bu ayarı çalıştı. Ayrıca hiçbir şey. Bu herhangi bir şey olarak kayıt bile yapmıyor çünkü bir NSLog (@ "% x", track.enabled) denediğimde, hala 1

bir kayıp olduğunu düşünüyorum ve düşünemiyorum iyi bir cevap almak için okuyabildiğim ve yeniden okuyabileceğim başka bir doküman parçası. Dışarıda kimse yardımcı olabilir, bu harika olurdu.

* Güncelleme: Ben Apple bir tutun var ve AVFoundation ekibine göre, bir HLS videonun bir parçayı kapatmak veya devre dışı bırakmak mümkün değildir. Ben şahsen, bu bir hata olduğunu hissediyorum bu yüzden bir bug report gönderdim (Apple'ın bunun bir sorun olduğunu söylemek için aynısını yapmalısınız). Ayrıca, 'u deneyebilir ve geri bildirim sayfasından bir feature enhancement request gönderin.

cevap

6

Yeni iOS 7 yanıtı: AVPlayer artık 2 yeni özelliğe 'birim' ve 'sessize' sahiptir. Bunları kullan!

Ben aynı şeyle uğraşıyorum: Burada


Ve

iOS 7 önce yaşam için orijinal cevaptır. Sesli akışlar ve akışlar oluşturduk. Sesi kapatmak veya tekrar açmak için [player replaceCurrentItemWithPlayerItem:muteStream] numaralı telefonu arayın.

Ayrıca bir hata raporu gönderdim. Görünüşe göre AVPlayer bu işlevselliğe sahip MacOS 10.7, ancak iOS için henüz yapmadı. Tabii

AVAudioMix is documented not to work on URL assets here

Yine de denedim ve sizin gibi ben gerçekten çalışmıyor bulundu.

+0

Cevabınız için teşekkürler, çözmeyi denediğim sorunlardan biri için benim için bir yol açtı. Ben aynı şeyi OpenAL ile yapmaya çalışıyorum ama bunu yapmanın düz bir yolunu bulamadım.AlSourcef (sourceID, AL_GAIN, volume) aracılığıyla sesi azaltabileceğinizi biliyorum; ama nasıl kapatılacağını bilmiyorum, bunun için hızlı bir çözüm var mı? – chathuram

1

Bunun için en iyi çözüm, akış URL'sini iki ses parçasıyla yerleştirmek olurdu! Biri normal ses ile olacak ve diğer ses parçası sessiz ses olacaktır.

Bu yolla, ComPuff'ın aslında iki ayrı URL akışı oluşturduğunuz şekilde önerdiği yöntemden ziyade, bunu yapmak daha mantıklıdır - bu gerekli değildir. İşte

Eğer ses parçaları geçmek için kullanabilirsiniz koddur:

float volume = 0.0f; 

AVPlayerItem *currentItem = self.player.currentItem; 
NSArray *audioTracks = self.player.currentItem.tracks; 

DLog(@"%@",currentItem.tracks); 

NSMutableArray *allAudioParams = [NSMutableArray array]; 

for (AVPlayerItemTrack *track in audioTracks) 
{ 
    if ([track.assetTrack.mediaType isEqual:AVMediaTypeAudio]) 
    { 
     AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParameters]; 
     [audioInputParams setVolume:volume atTime:kCMTimeZero]; 
     [audioInputParams setTrackID:[track.assetTrack trackID]]; 
     [allAudioParams addObject:audioInputParams]; 
    } 
} 

if ([allAudioParams count] > 0) { 
    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; 
    [audioMix setInputParameters:allAudioParams]; 
    [currentItem setAudioMix:audioMix]; 
} 

tek sorun zaman olması gerektiği benim akışı url yalnızca iki parça (video için bir ve ses için bir) olmasıdır aslında üç parça (2 ses parçası). Akış URL'si veya kodumla ilgili bir sorun olup olmadığını anlayamıyorum! Kodda herhangi bir hata tespit eden var mı?