AVAssetExportSession,AVMutableComposition w / AudioMix淡出不起作用

时间:2017-10-10 14:46:54

标签: ios swift avassetexportsession avmutablecomposition

我正在构建一个结合了几个视频的应用程序,将它们合并为一个并在视频中放置一个自定义的录音带。这一切都完美无瑕。现在我想淡出我的音频。另一方面,这不起作用,我不知道为什么。 这是我的代码:

@csrf_exempt
def seen(request, username):
    if request.method=='POST':
        nat = Nat.objects.filter(toUser=username)
        nat.update(show=False)
        return JsonResponse("test":"json response")

在这段代码之后,它继续使用另一种呈现视频本身的方法。 有人可以解释一下为什么这不起作用以及如何解决这个问题?

提前致谢!

2 个答案:

答案 0 :(得分:1)

Here is a code for add Video and audio url and set volume of both. Your result video will be fade in and fade out effect.

 func mergeVideoAndMusicWithVolume(videoURL: NSURL, audioURL: NSURL, startAudioTime: Float64, volumeVideo: Float, volumeAudio: Float, complete: ((NSURL?)) -> Void) -> Void {

    //The goal is merging a video and a music from iPod library, and set it a volume

    //Get the path of App Document Directory
    let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    let docsDir = dirPaths[0] as String

    //Create Asset from record and music
    let assetVideo: AVURLAsset = AVURLAsset(URL: videoURL)
    let assetMusic: AVURLAsset = AVURLAsset(URL: audioURL)

    let composition: AVMutableComposition = AVMutableComposition()
    let compositionVideo : AVMutableCompositionTrack = composition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID())
    let compositionAudioVideo: AVMutableCompositionTrack = composition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: CMPersistentTrackID())
    let compositionAudioMusic: AVMutableCompositionTrack = composition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: CMPersistentTrackID())

    //Add video to the final record

    do {
        try compositionVideo.insertTimeRange(CMTimeRangeMake(kCMTimeZero, assetVideo.duration), ofTrack:assetVideo.tracksWithMediaType(AVMediaTypeVideo)[0], atTime: kCMTimeZero)
    } catch _ {
    }

    //Extract audio from the video and the music
    let audioMix: AVMutableAudioMix = AVMutableAudioMix()
    var audioMixParam: [AVMutableAudioMixInputParameters] = []

    let assetVideoTrack: AVAssetTrack = assetVideo.tracksWithMediaType(AVMediaTypeAudio)[0]
    let assetMusicTrack: AVAssetTrack = assetMusic.tracksWithMediaType(AVMediaTypeAudio)[0]

    let videoParam: AVMutableAudioMixInputParameters = AVMutableAudioMixInputParameters(track: assetVideoTrack)
    videoParam.trackID = compositionAudioVideo.trackID

    let musicParam: AVMutableAudioMixInputParameters = AVMutableAudioMixInputParameters(track: assetMusicTrack)
    musicParam.trackID = compositionAudioMusic.trackID

    //Set final volume of the audio record and the music
    videoParam.setVolume(volumeVideo, atTime: kCMTimeZero)
    musicParam.setVolume(volumeAudio, atTime: kCMTimeZero)

    //Add setting
    audioMixParam.append(musicParam)
    audioMixParam.append(videoParam)

    //Add audio on final record
    //First: the audio of the record and Second: the music
    do {
    try compositionAudioVideo.insertTimeRange(CMTimeRangeMake(kCMTimeZero, assetVideo.duration), ofTrack: assetVideoTrack, atTime: kCMTimeZero)
    } catch _ {
    assertionFailure()
    }

    do {
    try compositionAudioMusic.insertTimeRange(CMTimeRangeMake(CMTimeMake(Int64(startAudioTime * 10000), 10000), assetVideo.duration), ofTrack: assetMusicTrack, atTime: kCMTimeZero)
    } catch _ {
    assertionFailure()
    }

    //Add parameter
    audioMix.inputParameters = audioMixParam

    //Remove the previous temp video if exist
    let filemgr = NSFileManager.defaultManager()
        do {
            if filemgr.fileExistsAtPath("\(docsDir)"){
                try filemgr.removeItemAtPath("\(docsDir)/movie-merge-music.mp4")
            } else {
            }
            } catch _ {
        }
    //Exporte the final record’
    let completeMovie = "\(docsDir)/\(randomString(5)).mp4"
    let completeMovieUrl = NSURL(fileURLWithPath: completeMovie)
    let exporter: AVAssetExportSession = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality)!

    exporter.outputURL = completeMovieUrl
    exporter.outputFileType = AVFileTypeMPEG4
    exporter.audioMix = audioMix
    exporter.exportAsynchronouslyWithCompletionHandler({ 

    switch exporter.status {

    case AVAssetExportSessionStatus.Completed:
        print("success with output url \(completeMovieUrl)")
        case  AVAssetExportSessionStatus.Failed:
            print("failed \(String(exporter.error))")
        case AVAssetExportSessionStatus.Cancelled:
            print("cancelled \(String(exporter.error))")
        default:
            print("complete")
        }            
    })
}

答案 1 :(得分:1)

有点不清楚你的" audioTrack"来自代码段,但请确保您为

获取正确的合成轨道
AVMutableAudioMixInputParameters

e.g。

let compositionAudioTrack = composition.addMutableTrack(withMediaType: AVMediaType.audio, preferredTrackID: kCMPersistentTrackID_Invalid)
let params = AVMutableAudioMixInputParameters(track: compositionAudioTrack)

可能只是那个

composition.tracks.first!

正在引用您的一个视频片段