2011-12-12 22 views
21

मैं आईफोन में प्ले स्टेशन 3 के लिए मीडिया सर्वर विकसित कर रहा हूं।एमओवी से एमपी 4 वीडियो रूपांतरण आईफोन प्रोग्रामेटिक रूप से

मुझे पता चला कि पीएस 3 समर्थन नहीं करता है .MOV फ़ाइल इसलिए मुझे इसे एमपी 4 या कुछ अन्य ट्रांसकोड में परिवर्तित करना है जो PS3 समर्थन करता है।

यह मैंने किया है, लेकिन अगर मैं अपनी स्रोत फ़ाइलों की तुलना में अलग फ़ाइल प्रकार सेट करता हूं तो यह दुर्घटनाग्रस्त हो जाता है।

  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 सेट तो यह दुर्घटनाओं "अवैध फ़ाइल प्रकार" कहा,। तो मुझे इसे AVFileTypeQuickTimeMovie पर सेट करना होगा और यह एमओवी फ़ाइल देता है।

क्या आईओएस में एमओवी से एमपी 4 में वीडियो को AVAssetExportSession के माध्यम से परिवर्तित करना संभव है ... या किसी तीसरे पक्षीय पुस्तकालयों के बिना?

+0

आप कभी भी इस के लिए एक समाधान मिला है? – newenglander

+0

क्या आपको इस रूपांतरण के लिए समाधान मिला ??? – svmrajesh

+0

आप आईओएस पर किसी भी यादृच्छिक। एमओवी कोडेक को नहीं पढ़ सकते हैं, केवल .mov/.m4v के रूप में एन्कोड किए गए एच .264 वीडियो को AVFoundation द्वारा पढ़ा जा सकता है। – MoDJ

उत्तर

7

एमओवी एमपी 4 के समान ही है, तो आप विस्तार को बदल सकते हैं और इसे काम कर सकते हैं, विंडोज फोन नहीं खेल सकता है .MOVS लेकिन एमपी 4 खेल सकता है, मैं इसे काम करने के लिए किया गया सब कुछ विस्तार से बदल गया है। .mp4 पर mov और यह ठीक काम करता है, और यह आईफोन पर शॉट किए गए वीडियो से है ... और यदि आप कुछ भी कर सकते हैं तो AVAssetExporter के साथ निर्यात करने का प्रयास करें और एमपी 4 और एम 4 ए के लिए वहां एक फ़ाइल प्रकार है, जैसा कि आप देख सकते हैं fileformat यूटीआई here

आशा है कि यह मदद करता है

+0

डैनियल, नीचे मैंने जो किया है, लेकिन यदि मैं अपनी स्रोत फ़ाइलों की तुलना में अलग-अलग फ़ाइल प्रकार सेट करता हूं तो यह क्रैश हो जाता है। –

+2

mp4 में एक्सटेंशन बदलना मेरे लिए काम करता है –

+7

यह समाधान के हर जगह काम नहीं करता है, उदाहरण के लिए कुछ एंड्रॉइड डिवाइस इन वीडियो को पुन: पेश नहीं करते हैं – Kasas

10

presetName का उपयोग करें "AVAssetExportPresetPassthrough" के बजाय "AVAssetExportPresetLowQuality"

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

सिर्फ इतना कहना है कि यूआरएल की तरह

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

यह

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

की तरह होना चाहिए नहीं हो सकता मुझे थोड़ी देर लिया कि यह पता लगाने की :-)

+0

आपको बहुत धन्यवाद –

3

उपयोग करना चाहता था नीचे कोड

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]; 

    }]; 
5

ऐसा करने के लिए आपको AVMutableComposition की आवश्यकता है। क्योंकि Asset सीधे आईओएस 5.0 के तहत एमपी 4 में ट्रांसकोड नहीं हो सकता है।

- (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; 
} 
+0

क्या यह सभी प्रारूपों या केवल .mov के लिए काम करता है ?? – yazh

5

आप एवीएसेट्स द्वारा एमपी 4 में वीडियो को परिवर्तित कर सकते हैं।

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; 
    } 
}]; 

आसानी से mp4 उपयोग इस link करने के लिए वीडियो परिवर्तित करने के लिए।

आप वीडियो को mp4 में कनवर्ट करने के लिए नमूना प्रोजेक्ट भी पा सकते हैं।

+0

क्या आउटपुट फ़ाइल ''' '' '' ''' '' '' '' '' '' '' '' '' '' '' '' '' '' '_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ मुझे समझ में नहीं आता कि मुझे कनवर्ट की गई फ़ाइल को सहेजना है .... और उस बिंदु पर मैं इसे सहेजना नहीं चाहता हूं, मैं बस इसे सर्वर पर अपलोड करना चाहता हूं, इसलिए मुझे '' 'outputURL''', मुझे बस इसे किसी ऑब्जेक्ट पर आउटपुट करने की आवश्यकता है। – Supertecnoboff

4

यहाँ कोड

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__).") 
    } 
} 
संबंधित मुद्दे