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 是新要求吗?你能指出我提到这个的任何文档吗? 由于在 &lt;src&gt; 属性中声明 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 生成器音频的主要内容,如果未能解决你的问题,请参考以下文章

Collada DAE 文件的 OS X QuickLook 实现?

_ZNote_Mac_技巧_QuickLook功能扩展

更喜欢我的 QuickLook 插件

QuickLook 空格键预览文件工具

如何使用 quicklook 插件分发 App

quicklook 不显示图像但有正确的数据