iOS 音视频格式

349 阅读4分钟

在 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)")
    }
    
  • 实时音频处理
    使用 AudioUnitAccelerate 框架处理 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
    )
    

三、开发中的注意事项

  1. 兼容性

    • 使用 H.264 和 AAC 格式以确保最大兼容性(尤其是支持 iOS 9 及以下设备)。
    • 对于 HEVC(H.265),需检查设备系统版本(iOS 10+)和解码能力。
  2. 性能优化

    • 使用硬件编码(VideoToolbox/AudioToolbox)提升效率,减少 CPU 开销。
    • 对视频进行动态分辨率适配(如 1080p vs 720p)以平衡画质和流量。
  3. 容器格式选择

    • 本地存储优先使用 .mov(QuickTime 容器),网络传输优先使用 .mp4(兼容性更好)。
  4. 音视频同步

    • 在编辑或播放时,确保音频和视频的 PTS(显示时间戳)对齐,避免卡顿或音画不同步。

四、典型场景示例

场景使用的格式框架
实时视频通话H.264 + AACWebRTC/AVFoundation
视频剪辑 AppH.264 + AAC(MP4 容器)AVFoundation
高清视频录制H.265 + AAC(MOV 容器)AVCaptureSession + AVAssetWriter
语音备忘录AAC(.m4a 容器)AVAudioRecorder
实时语音通信OpusWebRTC

总结

在 iOS 开发中,H.264/AAC 是最常用的核心组合,兼顾兼容性和性能;MP4/MOV 是最常见的容器格式;Opus 在实时通信中表现优异。实际开发中,通过 AVFoundationVideoToolbox 等框架,开发者可以灵活处理这些格式,并结合硬件加速优化性能。