8

在我的 iOS 应用程序中,我试图将iPod 库中的mp3文件导出到设备上应用程序的文档目录中。目前我正在尝试使用AVAssetExportSession但它不适用于mp3文件。它适用于m4a文件。

  • 是否可以使用 AVAssetExportSession 导出 mp3 文件?

  • AVAssetExportSession的合适outputFileType是什么?AVFileTypeAppleM4A适用于 m4a 文件)

谢谢!

4

3 回答 3

1

我面临同样的问题。不幸的是,没有任何 iOS 框架(AVFoundation、CoreMedia 等)支持 MP3 编码。

一个类似问题的答案建议使用Lame Encoder另一个问题提到一些用户能够成功编译 iOS (“我刚刚尝试为 LAME 构建静态库并确认它'工作'...... ”)。

另一种选择是使用 FFMpeg。似乎有些用户已经为 iOS 4.3 成功编译了它(请参阅此参考资料)。

考虑到您可能需要为 MP3 编码支付版税。此外,FFMpeg/Lame 的许可证可能会阻止您在闭源应用程序中使用他们的代码。

祝你好运!

于 2011-08-26T17:20:17.437 回答
0

它似乎只支持使用预设的com.apple.quicktime-movie (.mov) 和com.apple.coreaudio-format (.caf)AVAssetExportSession进行 mp3 转码的文件类型。在编写输出文件时,您还必须确保使用这些文件扩展名之一,否则将无法保存。AVAssetExportPresetPassthrough

mp3 输入文件支持的输出文件类型和扩展名以粗体显示(在 OS X 10.11.6 上测试):

  • com.apple.quicktime 电影 (.mov)
  • com.apple.m4a-音频 (.m4a)
  • 公共.mpeg-4 (.mp4)
  • com.apple.m4v 视频 (.m4v)
  • org.3gpp.adaptive-multi-rate-audio (.amr)
  • com.microsoft.waveform-audio (.wav)
  • public.aiff-音频 (.aiff)
  • public.aifc-音频 (.aifc)
  • com.apple.coreaudio 格式 (.caf)
于 2016-09-17T06:23:04.043 回答
0

这里的代码将帮助您从音乐库中导出 mp4

func displayMediaPicker() {
        let mediaPicker = MPMediaPickerController.init(mediaTypes: .anyAudio)
        mediaPicker.delegate = self
        mediaPicker.allowsPickingMultipleItems = false
        mediaPicker.loadView();
        self.present(mediaPicker, animated: true, completion: nil)
    }

func mediaPicker(_ mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {
        //
        self.dismiss(animated:true)

        if mediaItemCollection.count > 0 {

            let mediaItem = mediaItemCollection.items[0]
            let assetURL = mediaItem.value(forProperty: MPMediaItemPropertyAssetURL)
            let mediaAsset = AVURLAsset(url: assetURL as! URL, options: nil)

            let exporter = AVAssetExportSession.init(asset: mediaAsset, presetName: AVAssetExportPresetMediumQuality)
            exporter?.outputFileType = AVFileType.mp4

            let mediaPathToSave = //assign destination path here

            let exportURL = URL(fileURLWithPath: mediaPathToSave)
            exporter?.outputURL = exportURL

            // if incase you need first 30 seconds
            let startTime = CMTimeMake(0, 1)
            let stopTime = CMTimeMake(30, 1)
            let exportTimeRange = CMTimeRangeFromTimeToTime(startTime, stopTime)
            exporter?.timeRange = exportTimeRange

            exporter?.exportAsynchronously(completionHandler: { 
                //
                let status = exporter?.status

                if status == AVAssetExportSessionStatus.completed {

                    print("AVAssetExportSessionStatus successfull")
                    //do further code for exported file here
                }
            })
        }
    }
于 2017-11-16T10:41:33.873 回答