繁体   English   中英

如何从iOS设备的iPod库中导出mp3文件?

[英]How can I export an mp3 file from an iOS device's iPod library?

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

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

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

谢谢!

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

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

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

考虑到您可能需要为编码MP3支付版权费。 同样,FFMpeg / Lame的许可证可能会阻止您在封闭源应用程序中使用其代码。

祝好运!

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

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

  • com.apple.quicktime-movie(.mov)
  • com.apple.m4a-audio(.m4a)
  • public.mpeg-4(.mp4)
  • com.apple.m4v-video(.m4v)
  • org.3gpp.adaptive-multi-rate-audio(.amr)
  • com.microsoft.waveform-audio(.wav)
  • public.aiff-audio(.aiff)
  • public.aifc-audio(.aifc)
  • com.apple.coreaudio格式(.caf)

这里的代码将帮助您从音乐库中导出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
                }
            })
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM