- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
(请注意我已经看过 this other SO post 了。)
问题
我正在尝试将 avi 视频转换为 mp4,以便我可以使用 Objective-C 在 iOS 应用程序上本地播放它
我尝试过的
我正在尝试使用以下代码进行转换:
- (void)convertVideoToLowQuailtyWithInputURL:(NSURL*)inputURL outputURL:(NSURL*)outputURL handler:(void (^)(AVAssetExportSession*))handler {
[[NSFileManager defaultManager] removeItemAtURL:outputURL error:nil];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:inputURL options:nil];
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetHighestQuality];
exportSession.outputURL = outputURL;
exportSession.outputFileType = AVFileTypeMPEG4;
[exportSession exportAsynchronouslyWithCompletionHandler:^(void) {
handler(exportSession);
}];
}
从 exportSession 返回的错误是 Cannot Open
额外信息
当我运行试图通过 Mediainfo 转换的视频时,我得到以下视频信息:
7 332kb/s,1920*1080 (16:9),25.000 FPS,AVC (Baseline@L3.1) (CABAC/1 Ref Frames)
这是音频:
128 kb/s,8 000 Hz,16 位,1 channel ,PCM(小/有符号)
我还在 AVAssetExportSession
上使用了 exportPresetsCompatibleWithAsset:
方法并得到了以下结果:
AVAssetExportPreset1920x1080,
AVAssetExportPresetLowQuality,
AVAssetExportPresetAppleM4A,
AVAssetExportPresetHEVCHighestQuality,
AVAssetExportPreset640x480,
AVAssetExportPreset3840x2160,
AVAssetExportPresetHEVC3840x2160,
AVAssetExportPresetHighestQuality,
AVAssetExportPreset1280x720,
AVAssetExportPresetMediumQuality,
AVAssetExportPreset960x540,
AVAssetExportPresetHEVC1920x1080
另一件需要注意的事情是,在使用预设和输出播放时,我设法获得了一个基本上是白噪声的纯音频文件。这是使用预设 AVAssetExportPresetAppleM4A
。
我希望我记下了足够的信息。
更新
根据 Ashley 的评论,我创建了一个函数来返回与 Assets 兼容的导出设置。
- (void)determineCompatibleExportForAsset:(AVURLAsset *)asset completion:(void(^)(NSArray<ExportSettings *> *exports))handler {
NSArray<NSString *> *presets = @[
AVAssetExportPresetLowQuality,
AVAssetExportPresetMediumQuality,
AVAssetExportPresetHighestQuality,
AVAssetExportPresetHEVCHighestQuality,
AVAssetExportPreset640x480,
AVAssetExportPreset960x540,
AVAssetExportPreset1280x720,
AVAssetExportPreset1920x1080,
AVAssetExportPreset3840x2160,
AVAssetExportPresetHEVC1920x1080,
AVAssetExportPresetHEVC3840x2160,
AVAssetExportPresetAppleM4A,
AVAssetExportPresetPassthrough
];
NSArray<NSString *> *outputs = @[
AVFileTypeQuickTimeMovie,
AVFileTypeMPEG4,
AVFileTypeAppleM4V,
AVFileTypeAppleM4A,
AVFileType3GPP,
AVFileType3GPP2,
AVFileTypeCoreAudioFormat,
AVFileTypeWAVE,
AVFileTypeAIFF,
AVFileTypeAIFC,
AVFileTypeAMR,
AVFileTypeMPEGLayer3,
AVFileTypeSunAU,
AVFileTypeAC3,
AVFileTypeEnhancedAC3,
AVFileTypeJPEG,
AVFileTypeDNG,
AVFileTypeHEIC,
AVFileTypeAVCI,
AVFileTypeHEIF,
AVFileTypeTIFF
];
__block int counter = 0;
int totalCount = (int)presets.count * (int)outputs.count;
NSMutableArray<ExportSettings *> *exportSettingsArray = [@[] mutableCopy];
for (NSString *preset in presets) {
for (NSString *output in outputs) {
[AVAssetExportSession determineCompatibilityOfExportPreset:preset withAsset:asset outputFileType:output completionHandler:^(BOOL compatible) {
if (compatible) {
ExportSettings *exportSettings = [[ExportSettings alloc] initWithPreset:preset outputType:output];
[exportSettingsArray addObject:exportSettings];
}
counter++;
if (counter == totalCount) {
if (handler) {
handler([exportSettingsArray copy]);
}
}
}];
}
}
}
结果如下:
"Preset: AVAssetExportPresetAppleM4A Output: com.apple.m4a-audio",
"Preset: AVAssetExportPresetPassthrough Output: com.microsoft.waveform-audio",
"Preset: AVAssetExportPresetPassthrough Output: public.aifc-audio",
"Preset: AVAssetExportPresetPassthrough Output: public.aiff-audio",
"Preset: AVAssetExportPresetPassthrough Output: com.apple.coreaudio-format",
"Preset: AVAssetExportPresetPassthrough Output: com.apple.quicktime-movie"
由此我推断,使用预设 AVAssetExportPresetPassthrough
和输出类型 AVFileTypeQuickTimeMovie
是兼容的。
然而,当运行以下代码时:(我已经尝试将 .mp4、.mov 和 .qt 作为文件类型)
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"MyVideo.mov"];
NSURL *outputURL = [NSURL fileURLWithPath:filePath];
NSURL *localURL = [NSBundle URLForResource:@"20180626_145233-v" withExtension:@"avi" subdirectory:nil inBundleWithURL:[NSBundle mainBundle].bundleURL];
[self convertVideoToLowQuailtyWithInputURL:localURL outputURL:outputURL handler:^(AVAssetExportSession *exportSession) {
switch ([exportSession status]) {
case AVAssetExportSessionStatusFailed:
NSLog(@"Export failed: %@", [exportSession error]);
break;
case AVAssetExportSessionStatusCancelled:
NSLog(@"Export canceled");
break;
case AVAssetExportSessionStatusCompleted:
NSLog(@"Successfully");
NSLog(@"OutputURL: %@", outputURL.absoluteString);
break;
default:
break;
}
}];
调用:
- (void)convertVideoToLowQuailtyWithInputURL:(NSURL*)inputURL outputURL:(NSURL*)outputURL handler:(void (^)(AVAssetExportSession*))handler {
[[NSFileManager defaultManager] removeItemAtURL:outputURL error:nil];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:inputURL options:nil];
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetPassthrough];
exportSession.outputURL = outputURL;
exportSession.outputFileType = AVFileTypeQuickTimeMovie;
[exportSession exportAsynchronouslyWithCompletionHandler:^(void) {
handler(exportSession);
}];
}
我收到这个错误:
导出失败:错误域=AVFoundationErrorDomain 代码=-11800“操作无法完成”UserInfo={NSLocalizedFailureReason=发生未知错误 (-12842),NSLocalizedDescription=操作无法完成,NSUnderlyingError= 0x60400024def0 {Error Domain=NSOSStatusErrorDomain Code=-12842 "(null)"}}
最佳答案
打不开是因为iOS不支持AVI文件
这是 link to the Apple documentation on supported file types在 AVFoundation
中。
最后,您可以从 XCode 中检查 AVFileType
的定义来亲自查看此列表。
就其值(value)而言,cursory inspection on AVI via Google表示 AVI 容器存在一些限制,这些限制已在 iOS 支持的较新格式中得到纠正,因此以后可能没有动力添加支持。
同时也是一个potential issue由于 Microsoft 创建了 AVI,我找不到任何会禁止某人使用它的限制性许可,但是 IANAL。
关于iOS 将 AVI 转换为 MP4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51046842/
要将视频 MP4 转换为视频 MP4 anamorphose,我使用: ffmpeg -i input.mp4 -crf 15 -g 1 -intra output.mp4 我在 output.mp4
我有一个 .avi 视频。我需要将其中的一部分剪切为另一个 .avi 文件。当我这样做时,我会丢失剪切文件的质量: ffmpeg -i input.avi -ss 00:34:00 -t 00:10:
我有一个带有 SDK for Visual C++ 的视频采集卡。在 SDK 的回调中,我可以以 30 fps 的速度使用彩色帧 (640 x 480)。目前,我在一个单独的线程中将整个图像序列作为单
我在带有 Codec DV Video (dvds) 的文件夹(在 Windows 7 上)中有一堆 avi 文件。这些是直接从我的索尼 DCR-PC120E Pal 相机和索尼附带的软件复制而来的。
我必须为我正在做的项目录制视频。其中两个是 USB 摄像头,另一个是 IP 顶置摄像头。所有三个都连接到笔记本电脑。录制视频后,我需要能够在编辑器中打开它们(不是特别用于编辑,而是用于建模其中需要时间
有没有办法使用 mmread 或其他函数逐帧读取 .avi 视频文件,类似于使用 videoReader 和 readFrame 函数? 我使用了 mmread 但读取每一帧需要很长时间,因为它读取了
我想解复用然后复用 .avi 文件而不更改任何内容。 我的程序是这样的(为简洁而编辑): AVFormatContext *input_format_context = NULL; a
有一个 IP 网络摄像头,我前段时间写了一个 .NET 类。它基本上是一个 Timer 实现,它每五秒从相机 ping 一个快照 CGI 脚本。相机本身非常简陋。它没有任何类型的 API 供我使用,我
我自己正在学习matlab,我用matlab做了一个动画情节;现在我想把它保存为一个视频文件。你能告诉我如何在matlab中把我的动画转换成一个视频文件吗?下面是我的代码 x=[1:2]; for i
我正在尝试制作一个程序,从网络摄像头捕捉视频并从麦克风捕捉声音,但我卡在了我试图用静止图像制作电影的部分 我听说你需要使用 directshow,但它对我不起作用 有人知道捕获视频和声音并将其编码为文
我想在 PHP 页面上播放视频 (AVI/MPG)。我怎样才能做到这一点?我还想为每个视频生成缩略图。谁能推荐一些工具? 最佳答案 对于缩略图,您需要类似 ffmpeg安装在您的服务器上。 要播放视频
我正在使用 ffmpeg 剪切视频文件: ffmpeg - -ss 00:00:00 -t 00:00:30 不包括 *.avi 格式的不同文件格式是可以的。对于 avi 电影,ffmpeg 显示视
我正在尝试拆分持续时间为 1 小时到 8 分钟的视频 (.avi) 文件。 我正在使用以下命令 ffmpeg -i videos_22_05_18/cnbc.avi -ss 00:00:00 -to
我创建了一个 AVI file通过使用 Cairo 渲染帧。 AVI生成代码为part of an OCaml library .但是,ffmpeg 和 vlc 都只产生第一帧。如果我剪掉 avi 标
我有一台 Fujifilm FinePix Real 3D W3,它创建了 Fujifilm 所谓的 3D-AVI 文件。有一些程序可以将这些 3D-AVI 文件拆分为单独的左右电影,但它们涉及在 W
我正在尝试使用以下命令将 avi 转换为 mp4: ffmpeg -i avi_videos.avi -c copy new.mp4 我收到了一个错误(见下文),我不太明白。我需要添加哪些其他参数才能
背景故事: 我有一个 VB.net 程序(它使用一个更老的 COM 对象访问 DVR)以每 15 秒的长度创建顺序编号的 AVI 文件。每 15 秒创建一个新的 AVI,其中包含最近 15 秒的视频。
你好。 我有一个很大的视频文件。 ffmpeg , tcprobe和其他工具说,它是 AVI 容器中的 h264 流。 现在我想从视频中剪下小块。 问题:视频接缝的索引损坏/损坏。我通过 mplaye
我有一个 .avi 文件,它位于我服务器的一个文件夹中。此文件夹的名称带有重音符号。 问题是,当我将该文件放在标签中时,它会显示一个 txt 文件(我认为是 avi 文件编码),这显然是一个错误。它只
我有一个带有 3 个字幕流的 AVI 文件(mpeg4 视频)。我需要将第二个流提取到 SRT/txt 以便对翻译进行一些更正。我目前在一台 Ubuntu 机器上。 我尝试使用 avconv,但出现错
我是一名优秀的程序员,十分优秀!