首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVMutableAudioMix和AVAssetExportSession

AVMutableAudioMix和AVAssetExportSession
EN

Stack Overflow用户
提问于 2010-10-27 00:54:19
回答 3查看 5.3K关注 0票数 2

我想为导出会话设置淡入/淡出效果。但它不起作用。请帮帮我!

修剪工作完美!但是淡入/淡出不会:((

代码语言:javascript
复制
    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];
    }];
EN

回答 3

Stack Overflow用户

发布于 2010-11-22 16:33:39

您可以尝试添加以下行:

代码语言:javascript
复制
[exportAudioMixInputParameters setVolume:0.0 atTime:CMTimeMakeWithSeconds(start-0.01, 1)];

之前:

代码语言:javascript
复制
[exportAudioMixInputParameters setVolumeRampFromStartVolume:0.0 toEndVolume:1.0 timeRange:fadeInTimeRange];

示例代码:

代码语言:javascript
复制
//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;
票数 3
EN

Stack Overflow用户

发布于 2013-01-12 16:35:29

以下是解决方案。

setVolumeRampFromStartVolume不工作。

代码语言:javascript
复制
AVMutableAudioMix *exportAudioMix = [AVMutableAudioMix audioMix];
AVMutableAudioMixInputParameters *exportAudioMixInputParameters = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track];

//淡入

代码语言:javascript
复制
[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)];

//淡出

代码语言:javascript
复制
[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
EN

Stack Overflow用户

发布于 2013-05-11 04:46:15

您正在将音频混合参数添加到AVAssetTrack。

我的工作版本将音频混合参数设置为AVMutableCompostionTrack:

代码语言:javascript
复制
AVMutableCompositionTrack *compositionMainAudioTrack = [self.composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

然后

代码语言:javascript
复制
     bResult= [compositionMainAudioTrack insertTimeRange:CMTimeRangeFromTimeToTime(kCMTimeZero,compDuration) ofTrack:assetMainAudioTrack atTime:kCMTimeZero error:&error];

 AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:compositionMainAudioTrack];

        [audioInputParams setVolume:.85 atTime:kCMTimeZero];

不确定,但您可能希望将导出器与AVMutableComposition一起使用

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4025950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档