QuickLook 生成器音频
Posted
技术标签:
【中文标题】QuickLook 生成器音频【英文标题】:QuickLook Generator Audio 【发布时间】:2013-12-01 12:52:44 【问题描述】:我正在尝试创建一个 QuickLook 插件以从该包的 QuickLook 预览播放包内的音频,但我的尝试仅显示默认 QL 预览 - 更大的文件图标、文件名、类型、大小和修改日期。
我已经成功地将测试字符串显示为 kUTTPlainText,并使用我的 XCode 设置为目标 UTI 类型,并验证传递给 QLPreviewRequestSetDataRepresentation 的 CFDataRef 不为 NULL。
这是我在GeneratePreviewForURL
函数中的基本代码:
NSURL *audioFilePath = @"the file path";
CFDataRef data = (__bridge CFDataRef)[NSData dataWithContentsOfURL:audioFilePath];
QLPreviewRequestSetDataRepresentation(preview, data, kUTTypeAudio, NULL);
return noErr;
有什么想法吗?是否可以从 QuickLook 预览中播放音频?
【问题讨论】:
我怀疑您需要将更具体的类型传递给QLPreviewRequestSetDataRepresentation
(不仅仅是kUTTypeAudio
,而是识别音频格式的东西)。还要确保您遵循programming guide 中的调试步骤,这样您就可以确定这不是插件注册问题。
来自 Apple 在 QLPreviewRequestSetDataRepresentation 上的文档:“预览的内容数据必须是原生 Quick Look 类型。这些类型当前支持的 UTI 有:kUTTypeImage、kUTTypePDF、kUTTypehtml、kUTTypeXML、kUTTypePlainText、 kUTTypeRTF、kUTTypeMovie 和 kUTTypeAudio。"
我还验证了我提到的调试设置 - 任何人都可以验证播放音频是可能的吗?文档似乎暗示它是,但没有提供示例。
我已经尝试过显示一些带有<audio>
标签的 HTML,但仍然没有成功 - 只是无限期地显示加载消息。
【参考方案1】:
我是根据我的个人经验来回答这个问题的。
在 OSX 10.6.8 上使用 Xcode 4.2 可以在基于 HTML 的 QuickLook 插件中加载音频文件,只需使用 <audio>
标签的 <src>
属性:
OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options)
@autoreleasepool
if (QLPreviewRequestIsCancelled(preview)) return noErr;
NSMutableString *html=[[NSMutableString alloc] init];
NSDictionary *props;
props=@
(__bridge NSString *)kQLPreviewPropertyTextEncodingNameKey:@"UTF-8",
(__bridge NSString *)kQLPreviewPropertyMIMETypeKey:@"text/html",
;
[html appendString:@"<html>"];
[html appendString:@"<body>"];
[html appendString:@"<audio src=\"/tmp/AudioFile.mp3\" type=\"audio/mpeg\" controls=\"true\" autoplay=\"true\" />"];
[html appendString:@"</body>"];
[html appendString:@"</html>"];
QLPreviewRequestSetDataRepresentation(preview,(CFDataRef)[html dataUsingEncoding:NSUTF8StringEncoding],kUTTypeHTML,(CFDictionaryRef)props);
return noErr;
现在,在 Mavericks 上使用 Xcode 5.1,似乎使用 cid:
方案(我将在下面发布一个示例)都无法完成这项工作:
OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options)
@autoreleasepool
if (QLPreviewRequestIsCancelled(preview)) return noErr;
NSMutableString *html=[[NSMutableString alloc] init];
NSDictionary *props;
NSData *audioData=[NSData dataWithContentsOfFile:@"/tmp/AudioFile.mp3"];
props=@
(__bridge NSString *)kQLPreviewPropertyTextEncodingNameKey:@"UTF-8",
(__bridge NSString *)kQLPreviewPropertyMIMETypeKey:@"text/html",
(__bridge NSString *)kQLPreviewPropertyAttachmentsKey:@
@"AUDIO":@
(__bridge NSString *)kQLPreviewPropertyMIMETypeKey:@"audio/mpeg",
(__bridge NSString *)kQLPreviewPropertyAttachmentDataKey: audioData,
,
,
;
[html appendString:@"<html>"];
[html appendString:@"<body>"];
[html appendString:@"<audio src=\"cid:AUDIO\" type=\"audio/mpeg\" controls=\"true\" autoplay=\"true\" />"];
[html appendString:@"</body>"];
[html appendString:@"</html>"];
QLPreviewRequestSetDataRepresentation(preview,(CFDataRef)[html dataUsingEncoding:NSUTF8StringEncoding],kUTTypeHTML,(CFDictionaryRef)props);
return noErr;
我认为你应该为此 report a bug to Apple!
【讨论】:
那么你在OSX10.6下使用音频标签成功了吗?我在 OSX10.7 下没有运气。在源标签中使用内容 ID 是新要求吗?你能指出我提到这个的任何文档吗? 由于在<src>
属性中声明 URL 不再(遗憾地)起作用,我开始认为,一旦我查看了里面的示例代码,使用 Content ID 可能是一个很好的解决方案QuickLook 编程指南中“动态生成预览”一章的“生成丰富的 HTML”段落。这是链接:developer.apple.com/library/mac/documentation/userexperience/…
嘿...有什么消息吗,伙计?你有没有达到你的目标?【参考方案2】:
这里的一些 cmets 是指在基于 HTML 的 Quicklook 插件中使用音频(抱歉,还没有足够的声誉来添加额外的 cmets ?)。
我最近在 project I worked on 中遇到了同样的问题,我需要在其中嵌入音频文件,但正如其他人所指出的,尝试在 Quicklook 插件中使用引用为“CID:”对象的数据失败。
我找到的解决方案是将数据作为 Base64 编码嵌入到 HTML 中,如下所示:
<audio src="data:audio/wav;base64,base64Data">
将base64Data
替换为实际的 Base64 数据。任何 NSData 对象都可以使用以下方法转换为 Base64 字符串:
[dataObject base64EncodedStringWithOptions:0]
或者,如果您需要在 HTML 代码中多次引用该数据,您可以创建一个 javascript URL 对象并改用它:
let soundURL = new URL("data:audio/wav;base64,base64Data");
audioElement.src = soundURL;
【讨论】:
以上是关于QuickLook 生成器音频的主要内容,如果未能解决你的问题,请参考以下文章