1

更新: 不思議なことに、このコードは iPad 2 では正常に機能しますが、iPad 第 4 世代では機能しません。

更新 #2: ビデオに変更presetName:AVAssetExportPresetHighestQualityするとpresetName:AVAssetExportPresetPassThrough正常にエクスポートされますが、デバイスで再生できません。xCode のオーガナイザーを介してアプリケーション バンドルを自分のコンピューターに取り込めば、再生できます。繰り返しますが、この問題は iPad 4 でのみ発生し、iPad 2、64 ビット シミュレータ、Retina シミュレータ、1x シミュレータでは発生しません。

を使用してオーディオとビデオをミキシングしていAVExportSessionます。シミュレーターと iPad 2 では問題なく動作しますが、iPad 第 4 世代では動作しません。エクスポート セッションで-11820エラー ( AVErrorExportFailed) が発生しますが、プロセスから得られる有用な情報の範囲はそれくらいです。ソースファイルは存在し、他のすべては問題なく動作していますが、AVExportSession.

デバイスでも動作させるのを手伝ってもらえますか?

メソッドが冗長であることをお詫びします。

-(NSURL*)bindAudioAndVideo:(NSString*)audioFileName videoFileName:(NSString*)videoFileName
{

   //documents folder
   NSArray     *paths              = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
   NSString *documentsFolder       = [[NSString alloc] initWithString:[paths objectAtIndex:0]];    //Get the docs directory

    AVMutableComposition* mixComposition = [AVMutableComposition composition];

    NSString* audio_inputFileName   = audioFileName;
    NSString* audio_inputFilePath   = [documentsFolder stringByAppendingPathComponent:audio_inputFileName];
    NSURL*    audio_inputFileUrl    = [NSURL fileURLWithPath:audio_inputFilePath];

    NSString* video_inputFileName   = videoFileName;
    NSString* video_inputFilePath   = [documentsFolder stringByAppendingPathComponent:video_inputFileName];
    NSURL*    video_inputFileUrl    = [NSURL fileURLWithPath:video_inputFilePath];

    NSString* outputFileName        = @"outputFile.mp4";
    NSString* outputFilePath        = [documentsFolder stringByAppendingPathComponent:outputFileName];
    NSURL*    outputFileUrl         = [NSURL fileURLWithPath:outputFilePath];

    //Check files actually exist before beginning (they do)

    AVMutableComposition* mixComposition = [AVMutableComposition composition];
    CMTime nextClipStartTime = kCMTimeZero;

    AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:video_inputFileUrl options:nil];
    CMTimeRange video_timeRange = CMTimeRangeMake(kCMTimeZero,videoAsset.duration);
    AVMutableCompositionTrack *a_compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
    [a_compositionVideoTrack insertTimeRange:video_timeRange ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:nextClipStartTime error:nil];


    AVURLAsset* audioAsset = [[AVURLAsset alloc]initWithURL:audio_inputFileUrl options:nil];
    CMTimeRange audio_timeRange = CMTimeRangeMake(kCMTimeZero, audioAsset.duration);
    AVMutableCompositionTrack *b_compositionAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
    [b_compositionAudioTrack insertTimeRange:audio_timeRange ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:nextClipStartTime error:nil];



    AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality];
    _assetExport.outputFileType = @"com.apple.quicktime-movie";
    _assetExport.outputURL = outputFileUrl;

    [_assetExport exportAsynchronouslyWithCompletionHandler:
     ^(void ) {
         [self addSkipBackupAttributeToItemAtURL:outputFileUrl];
         NSLog(@"Completed. Tidy time.");

         switch ([_assetExport status]) {
             case AVAssetExportSessionStatusCompleted:
                 NSLog(@"Export Completed");
                 break;
             case AVAssetExportSessionStatusFailed:
                 NSLog(@"Export failed: %@", [[_assetExport error] localizedDescription]);
                 NSLog (@"FAIL %@",_assetExport.error); //-11820! I AM A USELESS ERROR CODE
                 NSLog (@"supportedFileTypes: %@", _assetExport.supportedFileTypes);
                 break;
             case AVAssetExportSessionStatusCancelled:
                 NSLog(@"Export cancelled");
                 break;
             default:
                 break;
         }


            NSTimer *refreshTimer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(exportCompleteRefreshView) userInfo:Nil repeats:NO];

         //Throw back to main thread unuless you want really long delays for no reason.
         [[NSRunLoop mainRunLoop] addTimer:refreshTimer forMode:NSRunLoopCommonModes];
     }
     ];



    return outputFileUrl;
}
4

1 に答える 1

1

問題が Retina iPad に関連している場合は、デバイスの解像度に関係しており、何らかの理由でシミュレーターがシミュレートしていません。

デバイスでビデオを作成していたので、Retina デバイスで 2048x1536 ビデオを作成していました (非 Retina デバイスでは 1024x768)。どうやらこれはAVExportSession処理するにはピクセルが多すぎるか、iPad が適切に再生するには多すぎるため、再生またはエクスポート時にさまざまな漠然としたエラー メッセージが表示されました。ピクセル解像度ではなくポイント解像度で記録することで、問題が解決したようです。

シミュレーターは、A6 ではなく、健全な Mac の比較的無制限のリソースを自由に使用できるため、ニシンのように見えます。

于 2013-11-04T05:30:57.487 に答える