QTKit - 合并两个具有不同宽度和高度的视频?

2023-12-12

我刚刚制作了一个简单的应用程序,它使用 QTKit 将两个视频合并在一起

这里是problem:

我刚刚发现,如果我尝试合并两个宽度和高度不同的视频,输出的视频的高度和宽度与大视频相同,但包含带有黑色和宽边框的小视频。

问题:

如何将两个视频合并在一起并获得具有正确格式(宽度/高度)的输出视频?

更好地理解我需要什么的示例:

我有两个视频:

视频 1 = 1920 x 1280 视频 2 = 1280 x 960

我想要的: 1920 x 1280 的视频(需要放大并裁剪小视频)

Code:

-(void)voidMethodToCombine {


NSError *err = nil;
QTMovie *myCombinedMovie = [[QTMovie alloc] initToWritableData:[NSMutableData data] error:&err];
if (err)
{
    NSRunAlertPanel(@"Errore nella creazione del video",[err localizedDescription], nil, @"Chiudi", nil, nil);
    return;
    return;
}


// Create the File Open Dialog class.
NSSavePanel *savePanel = [NSSavePanel savePanel]; //Dove salvo il video ?


if ([savePanel runModal])//Se premo ok
{   
    [indicatore setUsesThreadedAnimation:YES];
    [indicatore startAnimation:self];
    NSURL *saveURL = savePanel.URL;
    NSString *savePath = [saveURL path];
//Prelevo i 2 percorsi e gli inserisco negli array

NSString *video1 = [URLVideo1 stringValue];
NSString *video2 = [URLVideo2 stringValue];

NSURL *theURLvideo1 = [NSURL fileURLWithPath:video1];

NSURL *theURLvideo2 = [NSURL fileURLWithPath:video2];

if((theURLvideo1) && (theURLvideo2)) {



NSArray *myMovieURLs = [NSArray arrayWithObjects:theURLvideo1,theURLvideo2, nil];

for (NSURL *url in myMovieURLs)
{
    QTMovie *theMovie = [QTMovie movieWithURL:url error:&err];
    if (err){
        NSRunAlertPanel(@"Errore durante il caricamento di uno dei film",[err localizedDescription], nil, @"Chiudi", nil, nil);
        return;
    }
    QTTimeRange timeRange = QTMakeTimeRange(QTZeroTime, [theMovie duration]);
    QTTime insertionTime = [myCombinedMovie duration]; 
    [myCombinedMovie insertSegmentOfMovie:theMovie timeRange:timeRange atTime:insertionTime];
}

NSDictionary *writeAttributes = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], QTMovieFlatten, nil]; 
//Pannello di path salvataggio

bool success = [myCombinedMovie writeToFile:savePath withAttributes:writeAttributes error:&err];




[indicatore stopAnimation:self];
NSBeep();
NSString *dove = [[NSString alloc] initWithFormat:@"Video esportato in:\n%@",savePath];
NSRunAlertPanel(@"Esportazione avvenuta con successo!", dove, @"Ok", nil, nil);

if (!success)
{
    NSRunAlertPanel(@"Errore durante il salvataggio del video.",[err localizedDescription], nil, @"Chiudi", nil, nil);
    return;
    return;
}
}
//Se non esiste alcun percorso
else {

    NSRunAlertPanel(@"Impossibile selezionare i file.", @"Controlla di aver specificato un percorso.", @"Chiudi", nil, nil);
}

要做到这一点,最简单的方法是使用 AVFoundation 框架而不是 QTKit,因为编辑/操作视频要容易得多(imo),尽管它似乎有点慢并且代码可能不太紧凑。

我建议首先阅读 AVFoundation 编程指南:https://developer.apple.com/library/mac/documentation/AudioVideo/Conceptual/AVFoundationPG/AVFoundationPG.pdf

但这里有一个可以帮助您入门的基本示例。在开始之前,请确保您已链接到 AVFoundation 和 CoreMedia 框架。

在您的标头中,除了您可能添加的任何其他方法或 ivars 之外AVAssetExportSession *exporter and NSTimer *timer,以及一种方法- (void) monitorProgress;.

然后,您的实现文件将包含以下方法(假设您使用名为 doIt 的 IBAction 触发该方法)。并且不要忘记#import <AVFoundation/ AVFoundation.h> and #import <CoreMedia/CoreMedia.h>:

- (IBAction)doIt:(id)sender {
// Initial array of movie URLs
NSArray *myMovieURLs = [NSArray arrayWithObjects:[NSURL fileURLWithPath:@"/path/to/first.mov"], [NSURL fileURLWithPath:@"/path/to/second.mov"], nil];

// Create the composition & A/V tracks
AVMutableComposition *comp = [AVMutableComposition composition];
AVMutableCompositionTrack *compositionVideoTrack = [comp addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
AVMutableCompositionTrack *compositionAudioTrack = [comp addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

// A reference for insertion start time
CMTime startTime = kCMTimeZero;

for (int i=0; i< [myMovieURLs count]; i++){
    // Get asset 
    NSURL *movieURL = [myMovieURLs objectAtIndex:i];
    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:movieURL options:nil];

    // Get video and audio tracks (assuming video exists - test for audio as an empty track will crash the program!) and insert in composition tracks
    AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
    bool success = [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [asset duration]) ofTrack:videoTrack atTime:startTime error:nil];

    if ([[asset tracksWithMediaType:AVMediaTypeAudio]count]){
        AVAssetTrack *audioTrack = [[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
        success = [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [asset duration]) ofTrack:audioTrack atTime:startTime error:nil];
    }

    // increment the start time to the end of this first video
    startTime = CMTimeAdd(startTime, [asset duration]);
}

//Set the output URL
NSURL *outputURL = [NSURL fileURLWithPath:@"/path/to/output.mov"];

/* Create the exporter.  
 Note the preset type is up to you to choose.  If you wanted, you could check the asset's size (with [asset naturalSize]) or other values above and use that to base your preset on. 
 Use exportPresetsCompatibleWithAsset: to get a list of presets that are compatible with a specific asset.
 */
NSLog(@"Compat presets you could use: %@", [AVAssetExportSession exportPresetsCompatibleWithAsset:comp]);
exporter = [[AVAssetExportSession alloc] initWithAsset:comp presetName:AVAssetExportPreset640x480];

[exporter setOutputURL:outputURL];
[exporter setOutputFileType:AVFileTypeQuickTimeMovie];
[exporter exportAsynchronouslyWithCompletionHandler:^(void){
    switch ([exporter status]) {
        case AVAssetExportSessionStatusFailed:
            NSLog(@"Export failed: %@", [[exporter error] localizedDescription]);
            break;
        case AVAssetExportSessionStatusCancelled:
            NSLog(@"Export canceled");
            break;
        default:
            break;
    }
}];

// This is just a simple timer that will call a method to log the progress
timer=[NSTimer scheduledTimerWithTimeInterval:5
                                       target:self
                                     selector:@selector(monitorProgress)
                                     userInfo:nil
                                      repeats:YES];
}



-(void)monitorProgress{ 
if ([exporter progress] == 1.0){
    [timer invalidate];
}

NSLog(@"Progress: %f",[exporter progress]* 100);

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QTKit - 合并两个具有不同宽度和高度的视频? 的相关文章

  • 处于编辑模式时滑动即可删除

    我有一个使用 uitableview 的 iPhone 应用程序 我希望始终显示 重新排序 控件 并让用户滑动以删除行 我目前采取的方法是将表格视图置于编辑模式并允许在编辑模式下进行选择 self tableView editing YES
  • UICollectionView 滚动到任何页脚或页眉视图

    我想滚动到集合视图的页脚或标题视图 但是 标准方法是scrollToItemAtIndexPath仅滚动到单元格 void scrollToBottom NSInteger section self numberOfSectionsInCo
  • 如何获取未知大小 NSArray 的前 X 个元素?

    在 ObjectiveC 中我有一个 NSArray 我们称之为NSArray largeArray 我想要一个新的NSArray smallArray仅包含前 x 个对象 或者如果largeArray 的大小已经 这种方法 NSArray
  • 正确地从 NSString 创建图像

    我正在从字符串变量创建图像 以下是创建图像的代码片段 UIImage imageFromText NSString text FontName UIFont font set the font type and size UIFont fo
  • 从 CocoaPods 添加 pod 时,架构 x86_64 的重复符号

    我正在尝试使用谷歌分析 https developers google com analytics devguides collection ios v3 进入我的应用程序 但通过 CocoaPod 添加后立即收到此错误 以前我的 Pod
  • C++ 引用类型作为 Objective-C++ 中的实例变量

    Objective C 中禁止将 C 引用类型用作实例变量 我该如何解决这个问题 您不能明智地使用引用作为实例变量 因为无法初始化实例变量并且无法重新放置引用 另一种选择可能是简单地使用 可能是智能的 指针 另一种让您更接近 C 行为的可能
  • 如何降低iphone的sdk Audioqueue的声音?

    我正在使用 Aran Mulhollan 的 RemoteIOPlayer 在 SDK iphone 中使用音频队列 我可以毫无问题 添加两个信号来混合声音 通过乘以从 wav 文件中获得的 UInt32 来增加音量 但所有其他操作都会给我
  • 使用 Objective-C 将 HTML 文本转换为纯文本

    我有巨大的NSString里面有 HTML 文本 该字符串的长度超过 3 500 000 个字符 我怎样才能将此 HTML 文本转换为NSString里面有纯文本 我正在使用扫描仪 但它运行速度太慢 任何想法 这取决于您的目标 iOS 版本
  • 将 NSDecimalNumber 转换为 NSString

    我正在从如下所示的对象中检索密钥 po obj TypeID 3 TypeName Asset 键值的检索方式如下 NSString typeId NSString obj objectForKey TypeID typeId 不是 NSS
  • CoreMediaIO,错误更新的属性 kCMIODevicePropertyDeviceIsRunningSomewhere

    当某些进程开始使用相机时 我需要接收一个事件 我通过 CMIOObjectGetPropertyData 完成此操作 但它不能正常工作 只有第一次访问时才是正确的值 我还尝试使用 CMIOObjectAddPropertyListenerB
  • 带 ModalPresentationStyle 的弹出框在 iOS 7 iPad 中不居中

    我在使用 iOS 7 时遇到了一个问题 这似乎是一个错误 或者只是我没有做正确的事情 我有 modalViewController 它在 iPad 上以 ModalPresentationStyle 的形式显示为弹出窗口 而且它不是标准尺寸
  • 释放 Core Foundation 对象引用

    我是否需要释放 Core Foundation 对象来清理内存 如果是这样 怎么办 例如 在代码中 ABAddressBookRef addressBook ABAddressBookCreate CFArrayRef peopleArra
  • NSDictionary 上的 NSPredicate

    我试图根据字母表在表格视图中创建部分 并在这些部分下按字母顺序对我的条目进行排序 我已经收集了 bandArrayIndex 中 bandArray 每个条目的第一个字母 现在我尝试使用 NSPredicate 来计算每个字母有多少个 我正
  • 将第 3 方库 ZXing 导入 Xcode

    我尝试了多种方法将第 3 方库 ZXing 导入我的 iOS 应用程序 但所有方法都很痛苦 或者根本不起作用 如果有人可以建议我做错了什么 或者提出导入 ZXing 等库的更好方法 我将非常感激 一定比这个容易 这就是我所做的 结果是 My
  • 在 uilabel 中查找文本的位置 {x,y}

    我有一个来自服务器的字符串 我正在 UILabel multiligne 上显示它 在该字符串中 我正在识别一些特定的子字符串 我想在该子字符串上放置一个按钮 按钮将是 UILabel 的子视图 为此 我需要子字符串坐标 我经历过这个 但我
  • iPad 照片选择器崩溃

    我正在使用以下函数根据 UIActionSheet 的结果激活设备相机或图像选择器 如果 fromCamera YES 那么它适用于 iPhone 和 iPad 如果 fromCamera NO 那么它可以在 iPhone 上运行并出现图像
  • iPhone 应用程序中的异步、同步、线程

    我正处于一个应用程序的设计阶段 该应用程序将利用 REST Web 服务 并且在使用异步 同步和线程方面遇到了困境 这是场景 假设您有三个选项可供深入研究 每个选项都有自己的基于 REST 的资源 我可以使用同步请求延迟加载每个请求 但这会
  • 在横向中自动调整 UITableCells 内容的大小

    在 UITableView 中 我通过 UILabels 将内容添加到单元格中 定义最佳尺寸 与单元格宽度允许的一样大 我注意到只有tableView contentSize width是可靠的 因为cell contentView bou
  • Objective-C – 拥有包含 TestFlight SDK 的 TestFlight 配置

    我已按照 TestFlight 的说明复制 发布 配置 我还使用 TestFlight SDK 从我的应用程序获取实时报告 通过这样做 我必须在我的应用程序中包含一些 TestFlight 代码 当然 我不想在我的应用程序的发布版本中包含此
  • insertNewObjectForEntityForName:

    我使用 Xcode xcdatamodel 文件编辑器设置了一个实体 我创建了一个名为 Person 的实体 添加了一些属性 然后生成了一个 m 文件来表示它 一切都很好 现在 当我去编写一行代码时 例如 Person person Per

随机推荐

  • 处理多态对象集合的正确设计模式

    假设我有以下课程 class BaseObject public virtual int getSomeCommonProperty class Object1 public BaseObject public virtual int ge
  • Python从项目列表创建字典键

    我希望使用 Python 字典来跟踪一些正在运行的任务 这些任务中的每一个都有许多使其独一无二的属性 因此我想使用这些属性的函数来生成字典键 以便我可以使用相同的属性再次在字典中找到它们 像下面这样 class Task object de
  • Spring Boot War 在 Jboss 7.1 上不起作用

    我正在尝试在 Jboss 上部署 Spring boot 应用程序 我跟随this将我的 jar 转换为 war 文件的教程 但是当我尝试在 Jboss 上运行应用程序时 它给了我这个错误 17 02 31 462 ERROR org ap
  • 如何让一个数成为幂呢?

    我的 JavaScript 有这个 A B C 其他的我都有了 但是我怎样才能有C作为力量呢 我认为使用 会起作用 但它只是添加它 JavaScript 没有求幂运算符 实际上是按位异或运算符 尝试使用Math pow反而 var d Ma
  • iOS 应用程序生命周期 4/3GS/iPad 与 2G/3G

    我读过苹果的文档关于应用程序生命周期并进行了一些测试以了解不同设备上的应用程序生命周期 除 2G 外均运行 iOS 4 x 我已经测试了具有 多任务处理 功能的设备与一些不支持此功能的设备 iPhone 2G 3G 应用程序生命周期 STA
  • 使用 python 编译 pin 工具时出错,出现错误 C2872:“UINT32”:不明确的符号

    我正在尝试编译 pin 工具Python h我收到了超过 100 个关于不明确符号的错误 我试图分开include到不同的命名空间 但它产生了许多其他错误 包含时也会发生同样的情况windows h 所有错误看起来都是这样的 D proj
  • 为什么这个承诺会悄然落空?

    db collection findOne是一个异步操作 MongoDB 但这在这里并不重要 这就是为什么我在这里将它包装在一个承诺中 var letsDoSomething new Promise function resolve rej
  • 代码可以在 jsfiddle 中运行,但不能在 html 文档中运行

    我是 javascript 的初学者 希望有人能帮助我解决这个问题 我正在尝试制作一个带有 id 的 div 移动 来回滑动 该代码在 jsfiddle 中工作 但当我将其放入 html 文档中时将无法工作 我尝试将顶部部分放在单独的 js
  • MySQL:从表中选择日期位于当前周和当前月的数据

    我正在创建一个网络应用程序 如果用户单击名为 WEEK 的链接 该页面会显示该周提交的所有帖子 还有一个选项可以查看本月提交的所有帖子 posts 表中有一个名为 post date 的列 其中日期的存储格式为 YYYY MM DD 我的问
  • Nodejs HTTP 和 HTTPS 通过同一端口

    我一直在谷歌搜索并在 stackoverflow 上查看 但找不到我喜欢的答案 我有一个通过 HTTPS 和端口 3001 运行的 NodeJS 服务器 现在我想获取端口 3001 上的所有传入 HTTP 请求 并将它们重定向到相同的 UR
  • 为什么使用切片克隆列表会影响原始列表

    下面是我将数组内的对象更改为字符串的代码 无法弄清楚为什么它会影响原始数组 slice 应该克隆数组 如果我是对的 var cloned scope selected items slice 0 cloned forEach functio
  • Hibernate - 外键而不是实体

    目前 Hibernate 允许我直接加载由 一对一关系定义的对象 entity1 getEntity2 是否可以获取外键而不是对象 我看到的当前方法是添加到我的映射中 JoinColumn name message key ManyToOn
  • 使用 while 循环遍历数组? - MIPS [重复]

    这个问题在这里已经有答案了 我想循环遍历一个数字数组 例如 word 2 2 2 2 2 2 2 2 2 2 2 2 2 word 2 2 2 2 2 2 2 2 2 2 2 2 2 word 2 2 2 2 2 2 2 2 2 2 2 2
  • Jenkins 使用 Groovy 读取 Jenkinsfile 中文件的特定行

    我正在尝试读取某行的特定行html詹金斯中的文件stage with Groovy并将其内容保存到环境变量中 问题是 File and readLines 不允许 我能够加载文件 env WORKSPACE pwd def file rea
  • PostgreSQL 交叉表查询

    如何在 PostgreSQL 中创建交叉表查询 例如我有下表 Section Status Count A Active 1 A Inactive 2 B Active 4 B Inactive 5 我希望查询返回以下交叉表 Section
  • 短的、不区分大小写的字符串混淆策略

    我正在寻找一种识别方法 即编码and解码 一组带有一个标记的 Java 字符串 识别不应涉及数据库持久化 到目前为止 我已经研究了 Base64 编码和 DES 加密 但对于以下要求而言 两者都不是最佳的 Token应该尽可能短 令牌应该对
  • 如何释放通用 TList

    我怎样才能释放一个通用的TList
  • Android 2.2 Spinner 在 Actionbar 中看起来很旧

    在 Android 2 2 上 我的 ActionBar 中的 Spinner 看起来非常丑陋 并且下拉文本颜色与背景颜色相同 这使得文本不可读 这是相关代码 spinner new Spinner getSupportActionBar
  • 身份函数:模板和自动的区别

    我正在为我的一些类编写一个身份函数 用于记录其调用的计数 长话短说 指标 目前 我正在尝试计算使用模板与使用模板的性能差异 优点auto 这是从我正在做的代码中摘取的一个简短示例 namespace Metrics unsigned lon
  • QTKit - 合并两个具有不同宽度和高度的视频?

    我刚刚制作了一个简单的应用程序 它使用 QTKit 将两个视频合并在一起 这里是problem 我刚刚发现 如果我尝试合并两个宽度和高度不同的视频 输出的视频的高度和宽度与大视频相同 但包含带有黑色和宽边框的小视频 问题 如何将两个视频合并