2016-11-17 78 views
0

我合并了Swift2.3中的两个音频文件。减少合并音频文件?

它工作正常。文件大小为7MB。所以我无法发送到服务器。

如何减少音频文件的大小?这样我就可以轻松发送到服务器。 我附上了下面的代码。这对试图合并的人很有用:

func mixAudio() 
{ 
    let currentTime = CFAbsoluteTimeGetCurrent() 
    let composition = AVMutableComposition() 
    let compositionAudioTrack = composition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid) 
    compositionAudioTrack.preferredVolume = 0.8 
    let avAsset = AVURLAsset.init(URL: soundFileURL, options: nil) 
    print("\(avAsset)") 
    var tracks = avAsset.tracksWithMediaType(AVMediaTypeAudio) 
    let clipAudioTrack = tracks[0] 
    do { 
     try compositionAudioTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, avAsset.duration), ofTrack: clipAudioTrack, atTime: kCMTimeZero) 
    } 
    catch _ { 
    } 
    let compositionAudioTrack1 = composition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid) 
    compositionAudioTrack.preferredVolume = 0.8 

    let avAsset1 = AVURLAsset.init(URL: soundFileURL1) 
    print(avAsset1) 


    var tracks1 = avAsset1.tracksWithMediaType(AVMediaTypeAudio) 
    let clipAudioTrack1 = tracks1[0] 
    do { 
     try compositionAudioTrack1.insertTimeRange(CMTimeRangeMake(kCMTimeZero, avAsset1.duration), ofTrack: clipAudioTrack1, atTime: kCMTimeZero) 
    } 
    catch _ { 
    } 
    var paths = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true) 
    let CachesDirectory = paths[0] 
    let strOutputFilePath = CachesDirectory.stringByAppendingString("/newone.mov") 
    print(" strOutputFilePath is \n \(strOutputFilePath)") 

    let requiredOutputPath = CachesDirectory.stringByAppendingString("/newone.m4a") 
    print(" requiredOutputPath is \n \(requiredOutputPath)") 

    let audioFileOutput = NSURL.fileURLWithPath(requiredOutputPath) 
    print(" OUtput path is \n \(audioFileOutput)") 
    do { 

     try NSFileManager.defaultManager().removeItemAtURL(audioFileOutput) 
    } 
    catch _ { 
    } 
    let exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetAppleM4A) 
    exporter!.outputURL = audioFileOutput 
    exporter!.outputFileType = AVFileTypeAppleM4A 

    exporter!.exportAsynchronouslyWithCompletionHandler 
     {() -> Void in 
      print(" OUtput path is \n \(requiredOutputPath)") 
      print("export complete: \(CFAbsoluteTimeGetCurrent() - currentTime)") 

    do 
    { 
     print(audioFileOutput) 
     print(" OUtput path is \n \(requiredOutputPath)") 

     self.wasteplayer = try AVAudioPlayer(contentsOfURL: audioFileOutput) 
     self.wasteplayer.numberOfLoops = 0 
     self.wasteplayer.play() 

     } 
    } 

    catch _ 
    { 

    } 

    } 
+2

编码为MP3或AAC合并后? – Moritz

+0

Iam不编码任何东西..我只是合并两个音频文件(一个文件是背景歌曲()MP3和另一个是语音(M4A)我已经记录)。我附上上面的代码..我只是检查合并的文件在文件夹..大小应该是7MB.soi想要减小尺寸。 – HariKarthick

+1

这就是为什么我建议你在合并后编码你的音频到MP3或AAC ** ... – Moritz

回答

0

您必须为作者提供音频设置字典。 这里有下列格式,你可以看看

kAudioFormatMPEG4AAC:164(最低)

kAudioFormatAppleLossless:430,

kAudioFormatAppleIMA4:475,

kAudioFormatULaw:889,

kAudioFormatALaw :889

使用kAudioFormatMPEG4AAC它是最小的a蒙所有。

 let audioOutputSettings = [ 
      AVFormatIDKey : Int(kAudioFormatMPEG4AAC), 
      AVSampleRateKey :  //[ NSNumber numberWithInt: 16 ], AVEncoderBitDepthHintKey, 
       Int(44100.0), 
      AVNumberOfChannelsKey : Int(1), 
      AVChannelLayoutKey: NSData(bytes:&channelLayout, length:sizeof(AudioChannelLayout)), 
] 

这是在Swift中的上述设置。

在这条线

让出口= AVAssetExportSession(资产:组成,presetName:AVAssetExportPresetAppleM4A)

u能试试这个,而不是

let exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetLowQuality) 
+0

我的不好,你的代码没有加载到我的浏览器中,现在它有任何方法是的,我正在尝试 –

+1

我编辑了答案,你可以尝试做我在最后一行提到的改变。 –

+0

http://chat.stackoverflow.com/rooms/37266/discussion-between-grzegorz-krukowski-and-newbie 可能是一个参考 –