在 iOS 开发中,音频和视频的格式选择直接影响性能、兼容性和用户体验。以下是常见的音频和视频格式,以及实际开发中常用的场景:
一、音频格式
1. 常见音频格式
| 格式 | 特点 | 使用场景 |
|---|---|---|
| AAC(Advanced Audio Codec) | 高压缩率、音质好,iOS 原生支持(如 AVAudioRecorder 默认输出格式)。 | 音频录制、流媒体(如 Apple Music)、视频配音。 |
| MP3(MPEG-1 Audio Layer III) | 兼容性极广,压缩率中等,但音质略逊于 AAC。 | 老旧项目兼容性需求(如播放本地 MP3 文件)。 |
| WAV(Waveform Audio File Format) | 无损格式,文件体积大,保留原始音质。 | 音频处理工具(如波形分析)、录音后处理。 |
| PCM(Pulse Code Modulation) | 未压缩的原始音频数据,常用于实时处理。 | 音频采集(如麦克风输入)、音频算法开发(如 FFT 分析)。 |
| Opus | 低延迟、高压缩率,适合实时通信(如 VoIP)。 | 实时语音通话(如 WebRTC 集成)。 |
2. 实际开发中的使用
-
录制音频:
使用AVAudioRecorder录制音频时,默认使用 AAC 格式(kAudioFormatMPEG4AAC),并通过AVAudioSettings设置采样率(如 44.1kHz)、位深度(16-bit)等参数。let settings: [String: Any] = [ AVFormatIDKey: Int(kAudioFormatMPEG4AAC), AVSampleRateKey: 44100, AVNumberOfChannelsKey: 1, AVEncoderBitRateKey: 128000, AVLinearPCMIsBigEndianKey: false ] do { audioRecorder = try AVAudioRecorder(url: fileURL, settings: settings) audioRecorder.record() } catch { print("录音失败: $error)") } -
播放音频:
使用AVAudioPlayer播放本地或网络音频文件(支持 AAC、MP3、WAV 等格式)。do { audioPlayer = try AVAudioPlayer(contentsOf: audioURL) audioPlayer.play() } catch { print("播放失败: $error)") } -
实时音频处理:
使用AudioUnit或Accelerate框架处理 PCM 数据(如降噪、混响)。// 通过 AudioUnit 回调处理音频缓冲区 func audioProcessingCallback( _ inRefCon: UnsafeMutableRawPointer, _ ioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>, _ inTimestamp: UnsafePointer<AudioTimeStamp>, _ inBusNumber: UInt32, _ inNumberFrames: UInt32, _ ioData: UnsafeMutablePointer<AudioBufferList> ) -> OSStatus { // 处理 PCM 数据(如 FFT 变换) return noErr }
二、视频格式
1. 常见视频格式
| 格式 | 特点 | 使用场景 |
|---|---|---|
| H.264(MPEG-4 AVC) | 广泛兼容,压缩率高,iOS 原生支持(AVAssetExportSession 默认输出格式)。 | 视频录制、播放、流媒体(如 HLS)。 |
| H.265(HEVC) | 比 H.264 压缩率更高,但兼容性稍差(需 iOS 10+)。 | 4K/8K 视频存储(如相机 App)。 |
| ProRes | 无损压缩,高质量但体积大,适合专业编辑。 | 视频剪辑工具(如 Final Cut Pro 导出)。 |
| MOV(QuickTime Movie) | 容器格式,可封装 H.264/AAC 等数据,iOS 原生支持。 | 视频预览、本地存储。 |
| MP4(MPEG-4 Part 14) | 容器格式,兼容性极广,适合网络传输。 | 视频上传、跨平台播放。 |
2. 实际开发中的使用
-
视频录制:
使用AVCaptureSession捕获视频流,并通过AVAssetWriter将 H.264 编码的视频写入 MP4 文件。let videoOutput = AVCaptureMovieFileOutput() captureSession.addOutput(videoOutput) let fileURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("output.mp4") videoOutput.startRecording(to: fileURL, recordingDelegate: self) -
视频播放:
使用AVPlayer播放本地或网络视频(支持 H.264、H.265、MP4、MOV 等格式)。let player = AVPlayer(url: videoURL) let playerViewController = AVPlayerViewController() playerViewController.player = player present(playerViewController, animated: true) { player.play() } -
视频编辑:
使用AVMutableComposition合并多个视频片段,并通过AVAssetExportSession导出为 H.264 编码的 MP4 文件。let composition = AVMutableComposition() let videoTrack = composition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid) try? videoTrack.insertTimeRange(CMTimeRange(start: .zero, duration: asset.duration), of: asset.tracks(withMediaType: .video)[0], at: .zero) let exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality) exporter.outputURL = outputURL exporter.outputFileType = .mp4 exporter.exportAsynchronously { if exporter.status == .completed { print("视频导出成功") } } -
硬件编码:
使用VideoToolbox进行 H.264/H.265 的硬件编码(适用于高性能需求场景)。var compressionSession: VTCompressionSession? VTCompressionSessionCreate( allocator: kCFAllocatorDefault, width: width, height: height, codecType: kCMVideoCodecType_H264, encoderSpecification: nil, imageBufferAttributes: nil, compressedDataAllocator: nil, outputCallback: videoEncodeCallback, refcon: nil, compressionSessionOut: &compressionSession )
三、开发中的注意事项
-
兼容性:
- 使用 H.264 和 AAC 格式以确保最大兼容性(尤其是支持 iOS 9 及以下设备)。
- 对于 HEVC(H.265),需检查设备系统版本(iOS 10+)和解码能力。
-
性能优化:
- 使用硬件编码(
VideoToolbox/AudioToolbox)提升效率,减少 CPU 开销。 - 对视频进行动态分辨率适配(如 1080p vs 720p)以平衡画质和流量。
- 使用硬件编码(
-
容器格式选择:
- 本地存储优先使用
.mov(QuickTime 容器),网络传输优先使用.mp4(兼容性更好)。
- 本地存储优先使用
-
音视频同步:
- 在编辑或播放时,确保音频和视频的 PTS(显示时间戳)对齐,避免卡顿或音画不同步。
四、典型场景示例
| 场景 | 使用的格式 | 框架 |
|---|---|---|
| 实时视频通话 | H.264 + AAC | WebRTC/AVFoundation |
| 视频剪辑 App | H.264 + AAC(MP4 容器) | AVFoundation |
| 高清视频录制 | H.265 + AAC(MOV 容器) | AVCaptureSession + AVAssetWriter |
| 语音备忘录 | AAC(.m4a 容器) | AVAudioRecorder |
| 实时语音通信 | Opus | WebRTC |
总结
在 iOS 开发中,H.264/AAC 是最常用的核心组合,兼顾兼容性和性能;MP4/MOV 是最常见的容器格式;Opus 在实时通信中表现优异。实际开发中,通过 AVFoundation 和 VideoToolbox 等框架,开发者可以灵活处理这些格式,并结合硬件加速优化性能。