6

Ok Vì vậy, tôi có một luồng trực tiếp từ một URL bằng MPMoviePlayerController.Bắt MetaData từ MPMoviePlayerController

Player = [[MPMoviePlayerController alloc] 
       initWithContentURL:[NSURL URLWithString:@"MY_URL_HERE_I_REMOVED"]]; 
Player.movieSourceType = MPMovieSourceTypeStreaming 

Bây giờ luồng cung cấp cho Meta Data (Tôi tin đó là điều mọi người gọi nó). Ví dụ. Tên của tuyến đường, v.v.

Tôi muốn nhận thông tin này và hiển thị trên nhãn.

Tôi không biết làm thế nào để có được nó, tôi không thể thay đổi từ MPMoviePlayerController và sau khi tìm kiếm giờ tôi tìm thấy MPTimedMetadata tham khảo lớp học nhưng dunno làm thế nào để sử dụng để có được thông tin này.

Tuyệt vời nếu bạn có thể đề cập cách sử dụng thông báo cũng để kích hoạt mỗi khi dữ liệu này thay đổi.

Trả lời

14

Giả sử bạn đã biết loại siêu dữ liệu nào được gửi từ luồng (nếu bạn không sử dụng trình phát đa phương tiện như VLC để xem), trước tiên bạn phải đăng ký thông báo để nhận siêu dữ liệu theo khoảng thời gian và sau đó là một phương pháp để xử lý chúng.

Bắt đầu với các thông báo, chỉ

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(MetadataUpdate:) 
               name:MPMoviePlayerTimedMetadataUpdatedNotification 
              object:nil]; 

sau khi phân bổ MPMoviePlayerController.

Sau đó vào phương pháp MetadataUpdate

- (void)MetadataUpdate:(NSNotification*)notification 
{ 
    if ([streamAudioPlayer timedMetadata]!=nil && [[streamAudioPlayer timedMetadata] count] > 0) { 
     MPTimedMetadata *firstMeta = [[streamAudioPlayer timedMetadata] objectAtIndex:0]; 
     metadataInfo = firstMeta.value; 
    } 
} 

nơi streamAudioplayer là MPMoviePlayerController của bạn và metadataInfo một NSString để lưu trữ các giá trị. Ở trên sẽ nhận được thông tin về Nghệ sĩ và Bản nhạc của bài hát hiện đang phát.

Đây là trường hợp siêu dữ liệu chuẩn gửi bởi luồng phát hoặc luồng âm thanh. (không thể nói cho người khác vì tôi chưa thử)

Lưu ý rằng mỗi luồng có thể xử lý và gửi siêu dữ liệu khác nhau. Kể từ [streamAudioPlayer timedMetadata] là một NSArray bạn có thể

NSArray *metaArray = [streamAudioPlayer timedMetadata]; 
NSLog (@"%i", [metaArray count]); //to see how many elements in the array 
MPTimedMetadata *firstMeta = [[streamAudioPlayer timedMetadata] objectAtIndex:0]; 

Sử dụng thì debug console để hiển thị các nội dung của siêu dữ liệu bằng cách sử dụng các thuộc tính quan trọng, keyspace, dấu thời gian, giá trị.

Tất cả những điều trên chỉ là một ví dụ. Không có cách nào để xử lý siêu dữ liệu. Thông tin chi tiết có thể được tìm thấy tại

https://developer.apple.com/library/ios/#DOCUMENTATION/MediaPlayer/Reference/MPTimedMetadata_Class/Reference/Reference.html

cho tham chiếu lớp MPTimedMetadata và từ đó ... mã trên!

+0

Tuyệt vời !!! Cảm ơn! – Genevios

+0

Xin chào ... bốn năm sau, nhưng tôi vẫn có thể hỏi ... có trường hợp nào phương thức 'timedMetadata' trả về một mảng có nhiều hơn một cá thể' MPTimedMetadata' không? Ngay bây giờ tôi đang sử dụng một vòng lặp 'for-in' để nhận tất cả chúng, nhưng tôi tự hỏi nếu điều đó thực sự cần thiết thay vì chỉ sử dụng phần tử đầu tiên của mảng. Cảm ơn! –

+0

Về mặt kỹ thuật ... Có thể. Điều này sẽ yêu cầu phiên bản Icecast được biên dịch tùy chỉnh hoặc bản phát hành Shoucast/Icecast mới thay đổi điều này. Trong trường hợp đặc biệt, nó * có thể * trả về một đối tượng thứ hai với * có thể * địa chỉ web của trạm.Theo kinh nghiệm của tôi, tôi chắc chắn 100% rằng các máy chủ Shoutcast/Icecast tiêu chuẩn sẽ có siêu dữ liệu trên đối tượng đầu tiên (chỉ mục 0). – Pericles

Các vấn đề liên quan