AVAssetExportSessionを介したmp4のエクスポートが失敗する



Exporting Mp4 Through Avassetexportsession Fails



解決:

変換するようですのAVAssetインスタンスAVMutableCompositionがそのトリックを行いました。どうか、これが機能する理由を誰かが知っているなら、私に知らせてください。

これは新しいです_getDataFor(_:completion :)メソッドの実装



func _getDataFor(_ item:AVPlayerItem、completion:@escaping(Data?)->()){guard item.asset.isExportable else {completion(nil)return} let Composition = AVMutableComposition()let CompositionVideoTrack = Composition.addMutableTrack(withMediaType :AVMediaTypeVideo、preferredTrackID:CMPersistentTrackID(kCMPersistentTrackID_Invalid))let CompositionAudioTrack = Composition.addMutableTrack(withMediaType:AVMediaTypeAudio、preferredTrackID:CMPersistentTrackID(kCMPersistentTrackID_Invalid))let sourceVideoTrack = item.asset.tracks(withMediaType:AVMediaTypeVideo).first! sourceAudioTrack = item.asset.tracks(withMediaType:AVMediaTypeAudio).first! do {trycompositionVideoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero、item.duration)、of:sourceVideoTrack、at:kCMTimeZero)trycompositionAudioTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero、item.duration)、of:sourceAudioTrack、at:kCMTimeZero)} catch(_ ){completion(nil)return} let compatiblePresets = AVAssetExportSession.exportPresets(compatibleWith:composition)varプリセット:String = AVAssetExportPresetPassthrough if compatiblePresets.contains(AVAssetExportPreset1920x1080){preset = AVAssetExportPreset1920x1080} guard let exportSession = AVAssetExportSession(asset:composition、presetName )、exportSession.supportedFileTypes.contains(AVFileTypeMPEG4)else {completion(nil)return} var tempFileUrl = FileManager.default.urls(for:.documentDirectory、in:.userDomainMask)[0] .appendingPathComponent( 'temp_video_data.mp4'、isDirectory :false)tempFileUrl = URL(fileURLWithPath:tempFileUrl.path)exportSession.outputURL = tempFileUrl exportSession.outputFileType = AVFi leTypeMPEG4 let startTime = CMTimeMake(0、1)let timeRange = CMTimeRangeMake(startTime、item.duration)exportSession.timeRange = timeRange exportSession.exportAsynchronously {print( '(tempFileUrl)')print( '(exportSession.error)')データ=試してみましょう? Data(contentsOf:tempFileUrl)_ =試してみませんか? FileManager.default.removeItem(at:tempFileUrl)completion(data)}} 

スウィフト5:

import Foundation import AVKit func getDataFor(_ item:AVPlayerItem、completion:@escaping(Data?)->()){guard item.asset.isExportable else {completion(nil)return} let Composition = AVMutableComposition()let CompositionVideoTrack = Composition .addMutableTrack(withMediaType:.video、preferredTrackID:CMPersistentTrackID(kCMPersistentTrackID_Invalid))let CompositionAudioTrack = Composition.addMutableTrack(withMediaType:.audio、preferredTrackID:CMPersistentTrackID(kCMPersistentTrackID_Invalid))let sourceVideoTrack = item.asset.tracks(withMedia !! sourceAudioTrack = item.asset.tracks(withMediaType:.audio).first! do {trycompositionVideoTrack?.insertTimeRange(CMTimeRangeMake(start:CMTime.zero、duration:item.duration)、of:sourceVideoTrack、at:CMTime.zero)trycompositionAudioTrack?.insertTimeRange(CMTimeRangeMake(start:CMTime.zero、duration:item .duration)、of:sourceAudioTrack、at:CMTime.zero)} catch(_){completion(nil)return} let compatiblePresets = AVAssetExportSession.exportPresets(compatibleWith:composition)varプリセット:String = AVAssetExportPresetPassthrough if compatiblePresets.contains(AVAssetExportPreset1920x1080) {preset = AVAssetExportPreset1920x1080} guard let exportSession = AVAssetExportSession(asset:composition、presetName:preset)、exportSession.supportedFileTypes.contains(.mp4)else {completion(nil)return} var tempFileUrl = FileManager.default.urls(for:.documentDirectory 、in:.userDomainMask)[0] .appendingPathComponent( 'temp_video_data.mp4'、isDirectory:false)tempFileUrl = URL(fileURLWithPath:tempFileUrl.path)exportSession.outputURL = tempFileUrl exportSess ion.outputFileType = .mp4 let startTime = CMTimeMake(value:0、timescale:1)let timeRange = CMTimeRangeMake(start:startTime、duration:item.duration)exportSession.timeRange = timeRange exportSession.exportAsynchronously {print( '(tempFileUrl) ')print(' (String(describing:exportSession.error)) ')let data = try? Data(contentsOf:tempFileUrl)_ =試してみませんか? FileManager.default.removeItem(at:tempFileUrl)completion(data)}} 

AVURLAssetのデリゲートプロパティを正しく設定しているかどうかを確認してください。



[self.playerAsset.resourceLoader setDelegate:self queue:dispatch_get_main_queue()];

また、AVAssetResourceLoaderDelegateプロトコルに準拠します。それはあなたがする必要があるすべてです。