2017-01-20 8 views
0

Я новичок в быстром и программировании, я попытался объединить некоторые самописца файлы, которые я сделал с успехом, как, что:AVAssetTrack не видит AVMediaTypeAudio

func concatenateFiles(audioFiles: [URL], completion: @escaping (_ concatenatedFile: NSURL?) ->()) { 
    // Result file 
    var nextClipStartTime = kCMTimeZero 
    let composition = AVMutableComposition() 
    let track = composition.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid) 

    // Add each track 
    for audio in audioFiles { 
     let asset = AVURLAsset(url: NSURL(fileURLWithPath: audio.path) as URL, options: nil) 
     if let assetTrack = asset.tracks(withMediaType: AVMediaTypeAudio).first { 
      let timeRange = CMTimeRange(start: kCMTimeZero, duration: asset.duration) 
      do { 
       try track.insertTimeRange(timeRange, of: assetTrack, at: nextClipStartTime) 
       nextClipStartTime = CMTimeAdd(nextClipStartTime, timeRange.duration) 
      } catch { 
       print("Error concatenating file - \(error)") 
       completion(nil) 
       return 
      } 
     } 
    } 

    // Export the new file 
    if let exportSession = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetAppleM4A) { 
     let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) 

     let format = DateFormatter() 
     format.dateFormat = "yyyy:MM:dd-HH:mm:ss" 
     let currentFileName = "REC:\(format.string(from: Date()))" 

     let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] 


     let fileURL = documentsDirectory.appendingPathComponent("\(currentFileName).m4a") 
      // Remove existing file 
     do { 
      print(audioFiles.count) 
      try FileManager.default.removeItem(atPath: fileURL.path) 
      print("Removed \(fileURL)") 
     } catch { 
      print("Could not remove file - \(error)") 
     } 

     // Configure export session output 
     exportSession.outputURL = fileURL as URL 
     exportSession.outputFileType = AVFileTypeAppleM4A 
     // Perform the export 
     exportSession.exportAsynchronously() {() -> Void in 
       switch exportSession.status 
       { 
       case AVAssetExportSessionStatus.completed: 
        print("Export complete") 
        DispatchQueue.main.async(execute: { 
         if self.concatinatedArray == nil 
         { 
          self.concatinatedArray = [URL]() 
         } 
         self.concatinatedArray?.append(exportSession.outputURL!) 
         completion(fileURL as NSURL?) 
        }) 
        return print("success to Merge Video") 
       case AVAssetExportSessionStatus.failed: 
        completion(nil) 
        return print("failed to MERGE)") 
       case AVAssetExportSessionStatus.cancelled: 
        completion(nil) 
        return print("cancelled merge)") 
       default: 
        print("complete") 
       } 
     } 
    } 
} 

Но теперь, когда я хочу, чтобы объединить его с видео, я получил аварию на данный момент:

let aAudioAssetTrack: AVAssetTrack = aAudioAsset.tracks(withMediaType: AVMediaTypeAudio)[0] 

Я использую стандартный метод слияния, он работает с другими звуками, которые у меня есть, это не только с каскадными аудио файлов .. пожалуйста, помогите, как управлять им работать ? ...

ответ

0
AVURLAsset* avAsset = [[AVURLAsset alloc]initWithURL:[NSURL fileURLWithPath:path2] options:nil]; 

if ([[avAsset tracksWithMediaType:AVMediaTypeAudio] count] > 0) 
{ 
    AVAssetTrack *clipAudioTrack = [[avAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 
    [firstTrackAudio insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset.duration) ofTrack:clipAudioTrack atTime:kCMTimeZero error:nil]; 
} 
+0

Пробовал, ничего не меняя, мой ресурс Массив AVMediaTyeAudio пуст ... –

 Смежные вопросы

  • Нет связанных вопросов^_^