2008-12-21 41 views
17

Tôi đang tìm kiếm một số tệp âm thanh tôi có trên máy chủ của mình cho ứng dụng iPhone-ứng dụng mà tôi đang viết. Một số tệp âm thanh có kích thước khá lớn, ngay cả sau khi nén. Câu hỏi của tôi là, có một khuôn khổ Cocoa giúp tôi với đệm âm thanh để nó trở nên có sẵn cho người dùng trong khi phần còn lại đang được đưa xuống các đường ống? Nếu không, bất cứ ai có thể chỉ cho tôi đi đúng hướng để tìm hiểu thêm về các công nghệ cần thiết để thực hiện một điều như vậy xảy ra bằng cách sử dụng Objective-C/Cocoa?Truyền trực tuyến âm thanh từ máy chủ đến iPhone

Tài nguyên chính xác về đệm và nén âm thanh từ máy chủ < -> cơ sở hạ tầng khách hàng sẽ là lý tưởng.

Trả lời

24

Brad đã đề cập một bài đăng mà tôi đã viết để truyền âm thanh qua HTTP. Đó là cái này: Streaming and playing an MP3. Tôi không có ý là người liên kết với blog của riêng anh ấy nhưng nó có thể giải quyết được câu hỏi của bạn.

Về vấn đề khó giải quyết, bạn sẽ nhận thấy tôi đã thực hiện 4 cập nhật cho bài đăng đó (cách mà tôi đã làm nhiều hơn), sửa lỗi luồng, rò bộ nhớ và lưu vào mạng vấn đề. Có rất nhiều để có được chính xác chính xác.

+0

Matt, tôi là người hâm mộ lớn của trang web của bạn. Bạn là một trong số ít các nguồn cấp dữ liệu được chọn có mức độ ưu tiên cao về việc đảm bảo tôi luôn hoạt động trên các lần đọc. Cảm ơn bạn rất nhiều vì đã cống hiến lại với cái nhìn sâu sắc của bạn. – Coocoo4Cocoa

+0

Hey @MattGallagher, [bạn có nghĩ rằng có thể truyền âm thanh theo cách khác] (http://stackoverflow.com/questions/6166019/stream-audio-from-ios)? (Từ thiết bị iOS sang máy khác?) – Moshe

+0

@ Chạy Chạy máy chủ phương tiện truyền trực tuyến cũng khó như các tính năng bạn cần (có thể rất khó). Cung cấp một tệp MP3 đơn giản qua HTTP rất đơn giản và có thể xử lý hầu hết các tình huống thông thường. Phục vụ luồng trực tiếp vì nó đang được ghi lại rất khó. –

2

Không may, bạn sẽ có một chút công việc trước mặt bạn. Tôi đã phải làm điều này cho một dự án iPhone mùa hè năm ngoái. Hầu hết những gì bạn cần là trong Dịch vụ xếp hàng âm thanh trong hộp thoại AudioToolbox.

Làm việc với các dịch vụ xếp hàng âm thanh khá phức tạp, bạn sẽ phải thực hiện một loạt các cuộc gọi lại để cho biết cách xử lý các gói của bạn sau khi chúng thoát khỏi mạng.

Một người nào đó, tôi nghĩ Matt Gallagar, đã có một số mã mẫu trên blog không sao và có một loạt nội dung trong Danh sách gửi thư âm thanh lõi của Apple.

Tôi nhận thấy rằng tôi đã kết thúc không cần phải chuyển tiếp trên NSURL Connection để thực hiện phần mạng, vì phương thức ủy quyền didrecievedata của tôi không được kích hoạt đủ thường xuyên.

Xin lỗi tôi không thể chỉ thả một vài dòng mã như một ví dụ ở đây, nhưng lớp tôi đã viết để làm điều này xuất hiện ở khoảng 400 dòng.

1

Bạn có thể sử dụng lớp học AVPlayer từ khung công cụ AVFoundation để phát âm thanh từ tệp cục bộ hoặc từ máy chủ từ xa. Lớp AVPlayer sẽ thông báo cho bạn về sự sẵn sàng để chơi hoặc về sự cần thiết phải đệm thêm dữ liệu.

Tuy nhiên, nếu bạn muốn kiểm soát nhiều hơn, bạn chắc chắn nên sử dụng các dịch vụ Hàng đợi âm thanh. Sử dụng các dịch vụ Hàng đợi âm thanh hơi khó hơn một chút nhưng một khi bạn nhận được thông tin, bạn sẽ có thể tinh chỉnh quy trình phát lại âm thanh theo cách bạn muốn.

5

MPMoviePlayerController có thể phát tệp âm thanh. Nếu bạn khởi tạo đối tượng bằng url nội dung (ví dụ: đây có thể là tệp Mp3 trên máy chủ), nó sẽ truyền tệp và phát lại.

Việc khởi trông như thế này:

NSURL *theURL = [NSURL urlWithString:@"http://yourdomain.com/yourmediafile.mp3"]; 

MPMoviePlayerController* yourPlayerController = [[MPMoviePlayerController alloc] initWithContentURL:theURL]; 

Từ đó bạn có thể bật lên một cái nhìn phát sẽ hiển thị một thanh trượt cho chà kỹ thông qua các nội dung, và nó sẽ điền vào các thanh trượt như các bộ đệm nội dung.

[yourPlayerController shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationLandscapeRight]; 
[self presentMoviePlayerViewControllerAnimated:yourPlayerController]; 

Hoặc bạn chỉ có thể làm cho nó chơi và tạo ra giao diện người dùng của riêng bạn:

[yourPlayerController.moviePlayer play]; 

Phương pháp này phát lại sẽ cắt đứt các âm thanh khi khóa màn hình, trừ khi bạn nói với ứng dụng chạy ở chế độ nền trong tệp info.plist.

2

Tôi biết bây giờ bạn hy vọng đã giải quyết được vấn đề của mình. Nhưng chỉ trong trường hợp. Nếu bạn muốn có một giải pháp chuyển tiếp thẳng, bạn luôn có thể nhận được mã nhúng hoặc bất kỳ liên kết nào khác và tạo một tệp html ra khỏi nó. Giống như

<html> 
<body> 
<script type="text/javascript"> 
    var embedBaseUrl = 'http://www.tv.net/'; 
    var embedChannelId = 13; 
    var embedSize = [300,250]; 
    var embedAutoplay = true; 
</script> 
<script type="text/javascript"src="http://www.tv.net/assets/js/embed.js"></script> 
</body> 
</HTML> 

ViewController.h

@interface ViewController : UIViewController { 

NSString *videoURL; 

} 

@property (nonatomic, strong) NSString *videoURL; 

    (IBAction) tv; 

Và trong ViewController.m

@synthesize videoURL; 

    (IBAction) tv { 

    self.videoURL = @"http://dl.dropbox.com/x/xxxxxxxx/HTML/tv.html"; 

    VideoViewController *videoViewController = [[VideoViewController alloc] initWithNibName:nil bundle:nil]; 

    videoViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; videoViewController.videoURL = self.videoURL; 

    [self presentViewController:videoViewController animated:YES completion:nil]; } 

Và sau đó trong VideoViewController.h

IBOutlet UIWebView *videoView; 

NSString *videoURL; NSString *videoHTML; 

} 

@property(nonatomic, retain) IBOutlet UIWebView *videoView; @property(nonatomic, retain) NSString *videoURL; @property(nonatomic, retain) NSString *videoHTML; 

    (void) embedTV; 

VideoViewController.m 

@synthesize videoView, videoURL, videoHTML; 

    (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } 

    (void)embedTV { 

    videoHTML = [NSString stringWithFormat:@"\ \ \ \ iframe {position:absolute; top:50%%; margin-top:-130px;}\ body {background-color:#000; margin:0;}\ \ \ \ \ \ ", videoURL]; 

    [videoView loadHTMLString:videoHTML baseURL:nil]; } 
     (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. 

    videoView.backgroundColor = [UIColor blackColor]; videoView.opaque = NO; 

    [self embedTV]; } 

Bây giờ trong ví dụ của tôi, tôi gọi cho luồng video nhưng bạn có được điểm, bạn có thể truyền hoặc chơi những gì bạn muốn. Chỉ cần sử dụng UIWebView.

+1

vui lòng chỉnh sửa câu trả lời của bạn và định dạng mã thành nội dung có thể đọc được :-) – kleopatra

+1

Cảm ơn Sirko đã chỉnh sửa html cho tôi. Bài đăng đầu tiên của cô ấy. –

+0

Sẽ làm Kleopatra :-) –

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