【问题标题】:QTMovie addImage:forDuration:withAttributes: can't be played by QuickTime Player XQTMovie addImage:forDuration:withAttributes: QuickTime Player X 无法播放
【发布时间】:2011-10-18 12:09:43
【问题描述】:

我有一个 mov 文件,我正在修改它,方法是在电影的开头添加一个带有图像的轨道(使用 QTMovie 的 -addImage 方法)。当我展平这样的电影时(使用 QTMovie 的 -writeToFile: 方法),我得到另一个 .mov 文件,开头带有这个“水印”。 但是当我尝试播放它时,我得到的消息是需要安装 QuickTime 7 才能播放这样的文件(原始未处理的 mov 文件不需要 QuickTime Player 7,可以在 QT Player 中正常播放X(雪豹和狮子自带)。

我想知道是否可以让这个文件能够在 QuickTime Player X 上播放?我不希望我的应用程序的用户必须安装这个旧版本的播放器。此外,Final Cut Pro 7、Telestream Episode Engine 编码器、Autodesk Smoke 等一些应用程序在添加图像轨道后无法正确理解这种“文件格式”。

是否可以将图像添加为电影轨道,而不是图像轨道?也许使用旧的 QT API? (无论如何,QTKit 似乎仍然是原始的)。

我将“mpv4”指定为图像编码器(在 -addImage 方法中),但该水印图像仍然不被视为电影轨道,而是被视为使用电影编码器编码的图像轨道。

谢谢!

【问题讨论】:

  • 请提供更多信息。原始电影中使用的编解码器是什么?您可以在 QuickTime Player 的检查器中查找它。您是如何添加新曲目的? [QTMovie addImage:forDuration:withAttributes:] 不会添加新曲目,而是将图像添加到现有曲目。你是怎么把电影弄平的?您是否使用了“QTMovieFlatten”属性?水印是什么样的?
  • 其实我刚刚创建了一个新电影([[QTMovie alloc] initToWritableData:error:]),在电影中添加了一个图像(-addImage)(显然创建了一个新轨道,至少一个“图像”类型,因为一开始有 0 首曲目)。然后我将原始电影中的所有轨道复制到这个新创建的轨道中(遍历所有轨道并为每个轨道调用 addTrack:)。因此我没有使用任何特殊的编解码器。 QTPlayer 的电影检查器显示,除了原始电影轨道外,还有一个 MPEG4“视频”轨道,这是我使用“mpv4”编解码器编码的图像,不是真正的视频轨道
  • 然后我使用 [QTMovie -writeToFile:@"newmovie.mov" withAttributes:[NSDictionary dictionaryWithObj:[NSNumber numberWithBool:YES] forKey:QTMovieFlatten]] 保存了这个新创建的电影(这是唯一的方法我发现能够将所有曲目真正写入文件,否则我只是在 mov 文件中得到“符号链接”,以及本身大小为 4KB 的 mov 文件)。而且这个 mov 文件只能用 QuickTime 7 打开,我猜这可能会刺激最终用户。我希望我可以将图像转换为真正的视频轨道,而不是图像轨道。也许使用 QuickTime C API。
  • 好的,我知道了。制作包含多个视频轨道的电影是可能的,但许多应用程序不太可能理解这一点。 Quicktime 播放器将通过根据变换矩阵排列音轨来播放此类电影。 VLC 不会,它会在单独的窗口中播放每个曲目。你究竟期望得到什么?也许您只需要在现有视频轨道的开头添加图像?
  • 你好戴维德。我只是想在电影的开头和结尾添加一个图像(这个图像应该持续几秒钟,作为原始电影两端的某种预告片出现),保留原始视频编解码器如果可能的话,原始视频轨道。目前 VLC 不播放我生成的电影(以及其他一些应用程序)。如果我可以将图像添加为现有视频轨道的一部分,那就太好了。不过我不知道怎么做。

标签: objective-c macos cocoa qtkit


【解决方案1】:

制作一部新电影并设置属性允许编辑:

QTMovie* trailerMovie = [QTMovie movie];
[trailerMovie setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute];

选择原始电影中的时间范围并将它们附加到新电影中:

QTTimeRange selectionRange = QTMakeTimeRange(QTMakeTime(...), QTMakeTime(...));
[originalMovie setSelection:selectionRange];
[trailerMovie appendSelectionFromMovie:originalMovie];

添加图片:

[trailerMovie addImage:image forDuration:duration withAttributes:nil];

将电影保存到带有 QTMovieFlatten 属性的文件中:

[trailerMovie writeToFile:@"trailer.mov" withAttributes:[NSDictionary dictionaryWithObj:[NSNumber numberWithBool:YES] forKey:QTMovieFlatten]]

试试这个场景,请告诉我结果如何。

【讨论】:

  • 戴维德,谢谢你的回答。问题是我不仅需要添加预告片,还需要添加领导者,当首先添加时,它会创建自己的轨道。
  • 如果我将图像附加到电影的末尾,我只有一个结果轨道(前提是我指定的图像编码器与用于现有视频轨道的图像编码器相同)。但是一旦第一次添加图像(即使编解码器与电影相同),我发现自己有两条轨道。
  • 我会尝试在新电影中插入一小段电影。这将创建轨道。图像现在应该转到现有轨道。添加后删除第一段。我承认这是一种解决方法,但它可以节省您的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 2018-05-13
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 2014-05-12
相关资源
最近更新 更多