qt-faststart.c是FFmpeg项目中的一个文件,可以用来修改mp4视频的元数据位置。 下载demo
使用方式:
- 从github下载后需要改下
main函数名(这里我改成了qtfaststart_main) - 将.c文件拖入Xcode工程目录中,然后创建同名.h文件,并引入和main函数名,如下:
#ifndef qt_faststart_h
#define qt_faststart_h
#include <stdio.h>
int qtfaststart_main(int argc, char *argv[]);
#endif
- 在需要进行转码操作的oc文件内引入
#include "qt-faststart.h" - 转码操作,看代码:
/// 修改元数据位置
/// @param url mp4原视频的路径
/// @param completion 转码结束的回调
- (void)transcodingFrom:(NSURL *)url completion:(void (^)(NSString *outputPath))completion {
NSString *sanboxPath = nil; // 沙盒文件夹路径
NSString *fileName = nil; // 输出的文件名,例如:时分秒
// 使用NSFileManager在沙盒文件中创建转码结果的文件夹
// ...
// ...
NSString *outputPath = [sanboxPath stringByAppendingFormat:@"/%@.mp4", fileName]; // 输出视频的路径
NSString *commandStr = [NSString stringWithFormat:@"qt-faststart!#$%@!#$%@", [url.absoluteString stringByReplacingOccurrencesOfString:@"file://" withString:@""], outpath];
// 根据 !#$ 将指令分割为指令数组
NSArray *argv_array = [commandStr componentsSeparatedByString:(@"!#$")];
// 将OC对象转换为对应的C对象
int argc = (int)argv_array.count;
char** argv = (char**)malloc(sizeof(char*)*argc);
for(int i=0; i < argc; i++) {
argv[i] = (char*)malloc(sizeof(char)*1024);
strcpy(argv[i],[[argv_array objectAtIndex:i] UTF8String]);
}
// 打印日志
NSString *finalCommand = @"qt-faststart 运行参数:";
for (NSString *temp in argv_array) {
finalCommand = [finalCommand stringByAppendingFormat:@"%@", temp];
}
NSLog(@"%@", finalCommand);
// 传入指令数及指令数组
qtfaststart_main(argc, argv);
// 转码结束,回调
if (completion) {
completion(outputPath)
}
}