MOV到Mp4video转换iPhone编程

我正在iPhone上开发Play station 3的媒体服务器。

我开始知道,PS3不支持.MOV文件,所以我必须将其转换成Mp4或其他PS3支持的其他转码。

这是我所做的,但如果我设置不同的文件types比它的源文件崩溃。

AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:videoURL options:nil]; NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset]; if ([compatiblePresets containsObject:AVAssetExportPresetLowQuality]) { AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]initWithAsset:avAsset presetName:AVAssetExportPresetLowQuality]; exportSession.outputURL = [NSURL fileURLWithPath:videoPath]; exportSession.outputFileType = AVFileTypeMPEG4; CMTime start = CMTimeMakeWithSeconds(1.0, 600); CMTime duration = CMTimeMakeWithSeconds(3.0, 600); CMTimeRange range = CMTimeRangeMake(start, duration); exportSession.timeRange = range; [exportSession exportAsynchronouslyWithCompletionHandler:^{ switch ([exportSession status]) { case AVAssetExportSessionStatusFailed: NSLog(@"Export failed: %@", [[exportSession error] localizedDescription]); break; case AVAssetExportSessionStatusCancelled: NSLog(@"Export canceled"); break; default: break; } [exportSession release]; }]; } 

如果我在这里设置AVFileTypeMPEG4,那么它崩溃,说“无效的文件types”。 所以我必须将其设置为AVFileTypeQuickTimeMovie,它会给出MOV文件。

是否有可能在iOS通过AVAssetExportSession转换video从MOV到Mp4 …或没有任何第三方库?

presetName使用“AVAssetExportPresetPassthrough”而不是“AVAssetExportPresetLowQuality”

  AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]initWithAsset:avAsset presetName:AVAssetExportPresetPassthrough]; 

MOV是非常相似的MP4,你可能只能改变扩展名,并有它的工作,Windows Phone无法播放.MOVS,但可以播放mp4,所有我没有得到这个工作是改变扩展名.mov为.mp4它工作得很好,这是从iphone上拍摄的video…如果有什么可以def试着用AVAssetExporter出口,并尝试有MP4和M4A的文件types,你可以从这里的fileformat UTIs 看到

希望能帮助到你

你需要AVMutableComposition来做到这一点。 由于Asset不能在iOS 5.0下直接转码为MP4。

 - (BOOL)encodeVideo:(NSURL *)videoURL { AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil]; // Create the composition and tracks AVMutableComposition *composition = [AVMutableComposition composition]; AVMutableCompositionTrack *videoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; AVMutableCompositionTrack *audioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; NSArray *assetVideoTracks = [asset tracksWithMediaType:AVMediaTypeVideo]; if (assetVideoTracks.count <= 0) { NSLog(@"Error reading the transformed video track"); return NO; } // Insert the tracks in the composition's tracks AVAssetTrack *assetVideoTrack = [assetVideoTracks firstObject]; [videoTrack insertTimeRange:assetVideoTrack.timeRange ofTrack:assetVideoTrack atTime:CMTimeMake(0, 1) error:nil]; [videoTrack setPreferredTransform:assetVideoTrack.preferredTransform]; AVAssetTrack *assetAudioTrack = [[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; [audioTrack insertTimeRange:assetAudioTrack.timeRange ofTrack:assetAudioTrack atTime:CMTimeMake(0, 1) error:nil]; // Export to mp4 NSString *mp4Quality = [MGPublic isIOSAbove:@"6.0"] ? AVAssetExportPresetMediumQuality : AVAssetExportPresetPassthrough; NSString *exportPath = [NSString stringWithFormat:@"%@/%@.mp4", [NSHomeDirectory() stringByAppendingString:@"/tmp"], [BSCommon uuidString]]; NSURL *exportUrl = [NSURL fileURLWithPath:exportPath]; AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:composition presetName:mp4Quality]; exportSession.outputURL = exportUrl; CMTime start = CMTimeMakeWithSeconds(0.0, 0); CMTimeRange range = CMTimeRangeMake(start, [asset duration]); exportSession.timeRange = range; exportSession.outputFileType = AVFileTypeMPEG4; [exportSession exportAsynchronouslyWithCompletionHandler:^{ switch ([exportSession status]) { case AVAssetExportSessionStatusCompleted: NSLog(@"MP4 Successful!"); break; case AVAssetExportSessionStatusFailed: NSLog(@"Export failed: %@", [[exportSession error] localizedDescription]); break; case AVAssetExportSessionStatusCancelled: NSLog(@"Export canceled"); break; default: break; } }]; return YES; } 

您可以通过AVAssets转换mp4中的video。

 AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:videoURL options:nil]; NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset]; AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]initWithAsset:avAsset presetName:AVAssetExportPresetLowQuality]; NSString* documentsDirectory=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; exportSession.outputURL = url; //set the output file format if you want to make it in other file format (ex .3gp) exportSession.outputFileType = AVFileTypeMPEG4; exportSession.shouldOptimizeForNetworkUse = YES; [exportSession exportAsynchronouslyWithCompletionHandler:^{ switch ([exportSession status]) { case AVAssetExportSessionStatusFailed: NSLog(@"Export session failed"); break; case AVAssetExportSessionStatusCancelled: NSLog(@"Export canceled"); break; case AVAssetExportSessionStatusCompleted: { //Video conversion finished NSLog(@"Successful!"); } break; default: break; } }]; 

要轻松转换video到MP4使用此链接

您还可以find示例项目将video转换为MP4。

这是代码

  func encodeVideo(videoURL: NSURL) { let avAsset = AVURLAsset(URL: videoURL, options: nil) var startDate = NSDate() //Create Export session exportSession = AVAssetExportSession(asset: avAsset, presetName: AVAssetExportPresetPassthrough) // exportSession = AVAssetExportSession(asset: composition, presetName: mp4Quality) //Creating temp path to save the converted video let documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] let myDocumentPath = NSURL(fileURLWithPath: documentsDirectory).URLByAppendingPathComponent("temp.mp4").absoluteString let url = NSURL(fileURLWithPath: myDocumentPath) let documentsDirectory2 = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL let filePath = documentsDirectory2.URLByAppendingPathComponent("rendered-Video.mp4") deleteFile(filePath) //Check if the file already exists then remove the previous file if NSFileManager.defaultManager().fileExistsAtPath(myDocumentPath) { do { try NSFileManager.defaultManager().removeItemAtPath(myDocumentPath) } catch let error { print(error) } } url exportSession!.outputURL = filePath exportSession!.outputFileType = AVFileTypeMPEG4 exportSession!.shouldOptimizeForNetworkUse = true var start = CMTimeMakeWithSeconds(0.0, 0) var range = CMTimeRangeMake(start, avAsset.duration) exportSession.timeRange = range exportSession!.exportAsynchronouslyWithCompletionHandler({() -> Void in switch self.exportSession!.status { case .Failed: print("%@",self.exportSession?.error) case .Cancelled: print("Export canceled") case .Completed: //Video conversion finished var endDate = NSDate() var time = endDate.timeIntervalSinceDate(startDate) print(time) print("Successful!") print(self.exportSession.outputURL) default: break } }) } func deleteFile(filePath:NSURL) { guard NSFileManager.defaultManager().fileExistsAtPath(filePath.path!) else { return } do { try NSFileManager.defaultManager().removeItemAtPath(filePath.path!) }catch{ fatalError("Unable to delete file: \(error) : \(__FUNCTION__).") } } 

使用下面的代码

  NSURL * mediaURL = [info objectForKey:UIImagePickerControllerMediaURL]; AVAsset *video = [AVAsset assetWithURL:mediaURL]; AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:video presetName:AVAssetExportPresetMediumQuality]; exportSession.shouldOptimizeForNetworkUse = YES; exportSession.outputFileType = AVFileTypeMPEG4; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; basePath = [basePath stringByAppendingPathComponent:@"videos"]; if (![[NSFileManager defaultManager] fileExistsAtPath:basePath]) [[NSFileManager defaultManager] createDirectoryAtPath:basePath withIntermediateDirectories:YES attributes:nil error:nil]; compressedVideoUrl=nil; compressedVideoUrl = [NSURL fileURLWithPath:basePath]; long CurrentTime = [[NSDate date] timeIntervalSince1970]; NSString *strImageName = [NSString stringWithFormat:@"%ld",CurrentTime]; compressedVideoUrl=[compressedVideoUrl URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.mp4",strImageName]]; exportSession.outputURL = compressedVideoUrl; [exportSession exportAsynchronouslyWithCompletionHandler:^{ NSLog(@"done processing video!"); NSLog(@"%@",compressedVideoUrl); if(!dataMovie) dataMovie = [[NSMutableData alloc] init]; dataMovie = [NSData dataWithContentsOfURL:compressedVideoUrl]; }]; 

只是想说URL不可能是这样的

 [NSURL URLWithString: [@"~/Documents/movie.mov" stringByExpandingTildeInPath]] 

它一定是像

 [NSURL fileURLWithPath: [@"~/Documents/movie.mov" stringByExpandingTildeInPath]] 

花了我一段时间来弄清楚:-)