ios - AVAssetExportSession - 在 IOS 中加入 2 个 mp4 文件

标签 ios avfoundation avcomposition

我正在尝试使用以下代码在 ipad2 上将 2 个预先存在的 mpeg4 视频连接在一起。

-(void)mergeTestVideos
{

    //setup asset
    NSString *firstassetpath = [NSString stringWithFormat:@"%@mpeg4-1.mp4", NSTemporaryDirectory()];
    NSString *secondassetpath = [NSString stringWithFormat:@"%@mpeg4-2.mp4", NSTemporaryDirectory()];

    NSFileManager *fileManager = [NSFileManager defaultManager];

    AVAsset *firstAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:firstassetpath]];
    AVAsset *secondAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:secondassetpath]];

    NSLog(@"FirstAsset Is Readable = %d", firstAsset.isReadable);
    NSLog(@"FirstAsset Is playable = %d", firstAsset.isPlayable);
    NSLog(@"FirstAsset Is exportable = %d", firstAsset.exportable);
    NSLog(@"SecondAsset Is Readable = %d", secondAsset.isReadable);
    NSLog(@"SecondAsset Is playable = %d", secondAsset.isPlayable);
    NSLog(@"SecondAsset Is exportable = %d", secondAsset.exportable);

    //setup composition and track
    AVMutableComposition *composition = [[AVMutableComposition alloc]init];
    AVMutableCompositionTrack *track = [composition addMutableTrackWithMediaType:AVAssetExportPresetPassthrough preferredTrackID:kCMPersistentTrackID_Invalid];

    //add assets to track
    [track insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration) ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0] atTime:kCMTimeZero error:nil];

    [track insertTimeRange:CMTimeRangeMake(kCMTimeZero, secondAsset.duration) ofTrack:[[secondAsset tracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0] atTime:firstAsset.duration error:nil];

    // 5 - Create exporter
    AVAssetExportSession *exporter = [[AVAssetExportSession alloc]initWithAsset:composition presetName:AVAssetExportPresetPassthrough];

    NSString *outputURL = [NSString stringWithFormat:@"%@mergedvid.mp4", NSTemporaryDirectory()];

    NSLog(@"%@", exporter.supportedFileTypes);
    exporter.outputURL=[NSURL fileURLWithPath:outputURL];

    exporter.outputFileType = AVFileTypeMPEG4;
    [exporter exportAsynchronouslyWithCompletionHandler:^{
        dispatch_async(dispatch_get_main_queue(), ^{
            [self exportDidFinish:exporter];
        });
    }];

}

-(void)exportDidFinish:(AVAssetExportSession*)session {

    NSLog(@"export method");
    NSLog(@"%i", session.status);
    NSLog(@"%@", session.error);
}

输出如下:

- FirstAsset Is Readable = 1
- FirstAsset Is playable = 1
- FirstAsset Is exportable = 1
- SecondAsset Is Readable = 1
- SecondAsset Is playable = 1
- SecondAsset Is exportable = 1
- (
"com.apple.quicktime-movie",
"com.apple.m4a-audio",
"public.mpeg-4",
"com.apple.m4v-video",
"public.3gpp",
"org.3gpp.adaptive-multi-rate-audio",
"com.microsoft.waveform-audio",
"public.aiff-audio",
"public.aifc-audio",
"com.apple.coreaudio-format"
)
-export method
- 4
- Error Domain=AVFoundationErrorDomain Code=-11838 "Operation Stopped" UserInfo=0x155f76f0 {NSLocalizedDescription=Operation Stopped, NSLocalizedFailureReason=The operation is not supported for this media.}

好的,根据输出,我的文件没问题并且可以导出,并且 mp4 是受支持的输出类型。

有谁知道为什么它给我错误“此媒体不支持该操作”

最佳答案

我认为这个声明是你的罪魁祸首

AVMutableCompositionTrack *track = [composition addMutableTrackWithMediaType:AVAssetExportPresetPassthrough preferredTrackID:kCMPersistentTrackID_Invalid];

在这里,您在应该使用 AVMediaTypeVideoAVMediaTypeAudio 的地方传递 AVAssetExportPresetPassthrough

关于ios - AVAssetExportSession - 在 IOS 中加入 2 个 mp4 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20558461/

相关文章:

iOS 从 .mov 文件中提取音频

ios - iOS7 中的 AVAssetImageGenerator 随机失败

avasset - 未能初始化 AVAssetExportSession(iPhone XS、XR、XMax)

iphone - 从 JSON 生成 Xcdatamodel 文件

iOS 音频工具箱崩溃

ios - UIView 覆盖全屏,覆盖来自 UITabBarController 的选项卡

ios - avassetwriter startWriting()崩溃

iOS-如何使用 AVAsset 或 AVURLAsset 获取 .mp4 文件的持续时间

ios - 在 iOS 中创建具有模糊背景的 AVComposition

iphone - 动画 UILabel 文本大小增加和减少