【问题标题】:QuickLook Generator AudioQuickLook 生成器音频
【发布时间】: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,但仍然没有成功 - 只是无限期地显示加载消息。

标签: cocoa quicklook


【解决方案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;

【讨论】:

    猜你喜欢
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 2012-11-16
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多