2010-10-26 50 views
2

我想使导出会话的淡入/淡出效果。但它不起作用。请帮帮我!AVMutableAudioMix和AVAssetExportSession

修剪作品完美!但是淡入/淡出并不:(((

NSURL *assetURL = [song valueForProperty:MPMediaItemPropertyAssetURL]; 
     AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:assetURL options:nil]; 

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

     NSArray *tracks = [songAsset tracksWithMediaType:AVMediaTypeAudio]; 
     AVAssetTrack *track = [tracks objectAtIndex:0]; 
     id desc = [track.formatDescriptions objectAtIndex:0]; 
     const AudioStreamBasicDescription *audioDesc = CMAudioFormatDescriptionGetStreamBasicDescription((CMAudioFormatDescriptionRef)desc); 
     FourCharCode formatID = audioDesc->mFormatID; 


    // trim track 
     CMTime startTrimTime = CMTimeMakeWithSeconds(startTime, 1); 
     CMTime endTrimTime = CMTimeMakeWithSeconds(endTime, 1); 
     CMTimeRange exportTimeRange = CMTimeRangeFromTimeToTime(startTrimTime, endTrimTime); 
     exportSession.timeRange = exportTimeRange; 

    //add fade in, fade out  
      CMTime startFadeInTime = startTrimTime; 
      CMTime endFadeInTime = CMTimeMakeWithSeconds(startTime + 4.0, 1); 
      CMTimeRange fadeInTimeRange = CMTimeRangeFromTimeToTime(startFadeInTime, endFadeInTime); 

      CMTime startFadeOutTime = CMTimeMakeWithSeconds(endTime - 4.0, 1); 
      CMTime endFadeOutTime = endTrimTime; 
      CMTimeRange fadeOutTimeRange = CMTimeRangeFromTimeToTime(startFadeOutTime, endFadeOutTime); 

      AVMutableAudioMix *exportAudioMix = [AVMutableAudioMix audioMix]; 

      //AVMutableAudioMixInputParameters *exportAudioMixInputParameters = [AVMutableAudioMixInputParameters audioMixInputParameters]; 
      AVMutableAudioMixInputParameters *exportAudioMixInputParameters = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track]; 

      [exportAudioMixInputParameters setVolumeRampFromStartVolume:0.0 toEndVolume:1.0 timeRange:fadeInTimeRange]; 
      [exportAudioMixInputParameters setVolumeRampFromStartVolume:1.0 toEndVolume:0.0 timeRange:fadeOutTimeRange]; 

      exportAudioMix.inputParameters = [NSArray arrayWithObject:exportAudioMixInputParameters];  
      exportSession.audioMix = exportAudioMix; 
... 

    myDeleteFile(filePath); 
    exportSession.outputURL = [NSURL fileURLWithPath:filePath]; 


    [exportSession exportAsynchronouslyWithCompletionHandler:^{ 

     if (exportSession.status == AVAssetExportSessionStatusCompleted) { 
      NSLog(@"export session completed"); 
      // 
      //return YES; 
     } else { 
      NSLog(@"export session error"); 
      //return NO; 
     } 

     [exportSession release]; 
    }]; 
+0

有你找到了这个解决方案?请帮忙。 – iPhoneDv 2012-06-16 15:53:26

+0

“start”的定义在哪里? – zakdances 2012-07-30 16:54:47

回答

3

你可以尝试加入这一行:

[exportAudioMixInputParameters setVolume:0.0 atTime:CMTimeMakeWithSeconds(start-0.01, 1)]; 

前:

[exportAudioMixInputParameters setVolumeRampFromStartVolume:0.0 toEndVolume:1.0 timeRange:fadeInTimeRange]; 

示例代码:

//trim 
CMTime startTrimTime = CMTimeMakeWithSeconds(start, 1); 
CMTime endTrimTime = CMTimeMakeWithSeconds(start+length, 1); 
CMTimeRange exportTimeRange = CMTimeRangeFromTimeToTime(startTrimTime, endTrimTime); 
exportSession.timeRange = exportTimeRange; 


//add fade in, fade out 
AVMutableAudioMix *exportAudioMix = [AVMutableAudioMix audioMix]; 

NSMutableArray* inputParameters = [NSMutableArray arrayWithCapacity:1]; 
NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeAudio]; 
for(AVAssetTrack *track in tracks) { 
    //NSLog(@"track:%@", track); 
    CMTime startFadeInTime = startTrimTime; 
    CMTime endFadeInTime = CMTimeMakeWithSeconds(start + 4.0, 1); 
    CMTimeRange fadeInTimeRange = CMTimeRangeFromTimeToTime(startFadeInTime, endFadeInTime); 

    CMTime startFadeOutTime = CMTimeMakeWithSeconds(start+length - 4.0, 1); 
    CMTime endFadeOutTime = endTrimTime; 
    CMTimeRange fadeOutTimeRange = CMTimeRangeFromTimeToTime(startFadeOutTime, endFadeOutTime); 

    //AVMutableAudioMixInputParameters *exportAudioMixInputParameters = [AVMutableAudioMixInputParameters audioMixInputParameters]; 
    AVMutableAudioMixInputParameters *exportAudioMixInputParameters = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track]; 

    [exportAudioMixInputParameters setVolume:0.0 atTime:CMTimeMakeWithSeconds(start-0.01, 1)]; 
    [exportAudioMixInputParameters setVolumeRampFromStartVolume:0.0 toEndVolume:1.0 timeRange:fadeInTimeRange]; 
    [exportAudioMixInputParameters setVolumeRampFromStartVolume:1.0 toEndVolume:0.0 timeRange:fadeOutTimeRange]; 

    [inputParameters addObject:exportAudioMixInputParameters]; 
} 

exportAudioMix.inputParameters = inputParameters; 
exportSession.audioMix = exportAudioMix; 
+0

ldmiao,非常感谢您的回复!但它不适用于AVAssetExportSession:((((它只适用于AVAssetReaderAudioMixOutput。 – Another84 2010-12-02 13:37:06

+0

“开始”在哪里定义? – zakdances 2012-07-30 17:02:02

+0

yourfriendzak,谢谢你的回复,但现在它真的是旧的项目,我不记得了。 – Another84 2012-08-27 20:15:36

0

这里是解决方案。

setVolumeRampFromStartVolume不起作用。

AVMutableAudioMix *exportAudioMix = [AVMutableAudioMix audioMix]; 
AVMutableAudioMixInputParameters *exportAudioMixInputParameters = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track]; 

//淡入

[exportAudioMixInputParameters setVolume:0.0 atTime:CMTimeMakeWithSeconds(start-1, 1)]; 
[exportAudioMixInputParameters setVolume:0.1 atTime:CMTimeMakeWithSeconds(start, 1)]; 
[exportAudioMixInputParameters setVolume:0.5 atTime:CMTimeMakeWithSeconds(start+1, 1)]; 
[exportAudioMixInputParameters setVolume:1.0 atTime:CMTimeMakeWithSeconds(start+2, 1)]; 

//淡出

[exportAudioMixInputParameters setVolume:1.0 atTime:CMTimeMakeWithSeconds((start+length-2), 1)]; 
[exportAudioMixInputParameters setVolume:0.5 atTime:CMTimeMakeWithSeconds((start+length-1), 1)]; 
[exportAudioMixInputParameters setVolume:0.1 atTime:CMTimeMakeWithSeconds((start+length), 1)]; 

exportAudioMix.inputParameters = [NSArray arrayWithObject:exportAudioMixInputParameters]; 


// configure export session output with all our parameters 
exportSession.outputURL = [NSURL fileURLWithPath:filePath]; // output path 
exportSession.outputFileType = AVFileTypeAppleM4A; // output file type 
exportSession.timeRange = exportTimeRange; // trim time ranges 
exportSession.audioMix = exportAudioMix; // fade in audio mix 
// perform the export 
[exportSession exportAsynchronouslyWithCompletionHandler:^{ 

    if (AVAssetExportSessionStatusCompleted == exportSession.status) { 
     NSLog(@"AVAssetExportSessionStatusCompleted"); 

    } else if (AVAssetExportSessionStatusFailed == exportSession.status) { 
     NSLog(@"AVAssetExportSessionStatusFailed"); 

    } else { 
     NSLog(@"Export Session Status: %d", exportSession.status); 
    } 
}]; 
0

您要添加的音频混音参数到AVAssetTrack。

我的工作版本,设置音频混音PARAMS到AVMutableCompostionTrack:

AVMutableCompositionTrack *compositionMainAudioTrack = [self.composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 

然后

 bResult= [compositionMainAudioTrack insertTimeRange:CMTimeRangeFromTimeToTime(kCMTimeZero,compDuration) ofTrack:assetMainAudioTrack atTime:kCMTimeZero error:&error]; 

AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:compositionMainAudioTrack]; 

     [audioInputParams setVolume:.85 atTime:kCMTimeZero]; 

不知道,但你可能需要使用出口与AVMutableComposition

相关问题