我想为导出会话制作淡入/淡出效果。但它不起作用。请帮帮我!
修剪完美!但是淡入/淡出不会:((
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 :(得分: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;
答案 1 :(得分: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);
}
}];
答案 2 :(得分:0)
您正在将音频混合参数添加到AVAssetTrack。
我的工作版本将音频混合参数设置为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
一起使用