2012-07-17 20 views
5

Tôi đã cố gắng giải quyết vấn đề này trong 48 giờ tốt và không tìm ra bất kỳ thứ gì. Tôi có 2 đối tượng AVPlayer chơi các luồng trực tiếp http khác nhau. Rõ ràng, tôi không muốn cả hai họ chơi âm thanh cùng một lúc vì vậy tôi cần một cách để tắt tiếng một trong các video.Tắt tiếng luồng trực tiếp HTTP trong AVPlayer

của Apple suggests this cho tắt tiếng một track âm thanh chơi trong AVPlayer ...

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]; 

Khi điều này không làm việc (sau nhiều lần lặp), tôi tìm thấy tài sản của AVPlayerItemTrack kích hoạt và cố gắng thiết lập đó để NO. Cũng không có gì. Điều này thậm chí không đăng ký làm bất cứ điều gì vì khi tôi thử NSLog (@ "% x", track.enabled), nó vẫn hiển thị là 1.

Tôi đang thua lỗ và không thể nghĩ một tài liệu khác tôi có thể đọc và đọc lại để có câu trả lời hay. Nếu bất cứ ai ngoài kia có thể giúp, điều đó thật tuyệt vời.

* Cập nhật: Tôi đã nhận một tổ chức của Apple và theo nhóm AVFoundation, nó là không thể để tắt hoặc vô hiệu hóa một ca khúc của một video HLS. Tôi, cá nhân, cảm thấy như thế này là một lỗi vì vậy tôi đã gửi một bug report (Bạn nên làm như vậy để nói với Apple rằng đây là một vấn đề). Bạn cũng có thể thử và gửi feature enhancement request qua trang phản hồi của họ.

Trả lời

6

iOS 7 trả lời mới: AVPlayer giờ đây có 2 thuộc tính mới 'volume' và 'muted'. Sử dụng chúng!


Và đây là câu trả lời ban đầu cho cuộc sống trước khi iOS 7:

Tôi đã đối phó với những điều tương tự. Chúng tôi đã tạo luồng và luồng bị tắt tiếng bằng âm thanh. Để tắt hoặc bật tiếng bạn gọi [player replaceCurrentItemWithPlayerItem:muteStream].

Tôi cũng đã gửi báo cáo lỗi. Có vẻ như AVPlayer có chức năng này trên MacOS 10.7 nhưng chưa được chuyển sang iOS.

AVAudioMix is documented not to work on URL assets here

Dĩ nhiên tôi đã thử nó dù sao, và như bạn tôi thấy nó thực sự không hoạt động.

+0

Cảm ơn câu trả lời đã mở ra một con đường cho tôi vì một trong những vấn đề mà tôi đang cố gắng giải quyết. Tôi đang cố gắng làm điều tương tự với OpenAL nhưng không tìm ra một cách thẳng tiến để làm điều đó.Tôi biết bạn có thể giảm âm lượng thông qua alSourcef (sourceID, AL_GAIN, volume); nhưng không biết làm thế nào để tắt tiếng nó, là có một cách giải quyết nhanh chóng này? – chathuram

1

Giải pháp tốt nhất cho việc này là thực sự nhúng nguồn cấp dữ liệu url của luồng với hai bản âm thanh! Một là với âm thanh bình thường và bản âm thanh khác sẽ là âm thanh bị tắt tiếng.

Điều này có ý nghĩa hơn khi thực hiện theo cách này chứ không phải cách ComPuff đề xuất như cách bạn thực sự tạo hai luồng URL riêng - không bắt buộc.

Dưới đây là đoạn code mà bạn có thể sử dụng để chuyển đổi các file audio:

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]; 
} 

Vấn đề duy nhất là url luồng của tôi là chỉ hiển thị hai đường ray (một cho video và một cho âm thanh) khi cần thực sự là ba bài hát (2 bản âm thanh). Tôi không thể làm việc ra nếu đây là một vấn đề với url dòng hoặc mã của tôi! Bất cứ ai có thể phát hiện bất kỳ sai lầm nào trong mã?