如何使用强制(MP3)类型从URL制作QTMovie播放文件?

Mic*_*ael 5 cocoa mp3 qtkit objective-c progressive-download

我正在使用QTKit逐步从URL下载和播放MP3.根据此文档,这是我应该用来完成的代码:

NSURL *mp3URL = [NSURL URLWithString:@"http://foo.com/bar.mp3"];

NSError *error = nil;
QTMovie *sound = [[QTMovie alloc] initWithURL:mp3URL error:&error];
[sound play];
Run Code Online (Sandbox Code Playgroud)

这有效,并且完全符合我的要求 - MP3 URL被懒散地下载并立即开始播放.但是,如果URL没有".mp3"路径扩展名,则会失败:

NSURL *mp3URL = [NSURL URLWithString:@"http://foo.com/bar"];

NSError *error = nil;
QTMovie *sound = [[QTMovie alloc] initWithURL:mp3URL error:&error];
[sound play];
Run Code Online (Sandbox Code Playgroud)

没有给出错误,没有引发异常; 声音的持续时间只是设置为零,没有任何播放.

我找到解决此问题的唯一方法是通过手动加载数据并使用QTDataReference强制类型:

NSURL *mp3URL = [NSURL URLWithString:@"http://foo.com/bar"];
NSData *mp3Data = [NSData dataWithContentsOfURL:mp3URL];

QTDataReference *dataReference = 
    [QTDataReference dataReferenceWithReferenceToData:mp3Data
                                                 name:@"bar.mp3"
                                             MIMEType:nil];
NSError *error = nil;
QTMovie *sound = [[QTMovie alloc] initWithDataReference:dataReference error:&error];
[sound play];
Run Code Online (Sandbox Code Playgroud)

然而,这迫使我在开始播放之前同步完全下载所有MP3,这显然是不可取的.有没有办法解决?

谢谢.

编辑

实际上,路径扩展似乎与它无关; Content-Type根本没有在HTTP标头中设置.即便如此,后一种代码仍有效,而前者则无效.任何人都知道一种方法来解决这个问题,而无需访问服务器?

编辑2

任何人?我无法在任何地方找到相关信息,谷歌现在令人沮丧地将此页面显示为我的大多数查询的最佳结果...

Tho*_*ing 0

两个想法。(第一个有点 hacky):
为了解决缺少的内容类型,您可以嵌入一个小型 Cocoa 网络服务器来补充缺少的标头字段,并通过该“代理”路由您的 NSURL。

一些 Cocoa http 服务器实现:

第二个是切换到较低级别的框架(从 QTKit 到 AudioToolbox)。
您需要更多代码,但是有一些关于如何使用 AudioToolbox 流式传输 mp3 的非常好的资源。
例如: http ://cocoawithlove.com/2008/09/streaming-and-playing-live-mp3-stream.html

就我个人而言,我会选择第二种选择。AudioToolbox 不像 QTKit 那么简单,但它为您的问题提供了一个干净的解决方案。它还可在 iOS 和 Mac OS 上使用,因此您会找到大量信息。

更新:
您是否尝试使用另一个初始化程序?例如

+ (id)movieWithAttributes:(NSDictionary *)attributes error:(NSError **)errorPtr
Run Code Online (Sandbox Code Playgroud)

您可以插入密钥的 URL QTMovieURLAttribute,也许您可​​以通过在该字典中提供其他属性来补偿缺少的内容类型。这个开源项目有一个 QTMovie 类别,其中包含完成类似事情的方法: http://vidnik.googlecode.com/svn-history/r63/trunk/Source/Categories/QTMovie+Async.m