iOS 视频格式转换与压缩怎么实现?从 AVFoundation、H.264 到码率与分辨率
在前面的文章里,我们已经把文件浏览器逐步扩展成一个真正的文件处理平台:
01 iOS 文件浏览器架构
02 GB 级大文件处理
03 Wi-Fi 文件传输
04 SMB / NAS
05 WebDAV
06 FTP
07 ZIP / RAR / 7z
08 HEIC / JPEG / PNG / WebP
这一篇继续进入另一个非常高频的文件处理能力:
视频转换与压缩
用户最常见的问题通常不是:
AVFoundation 的底层时间轴怎么工作的?
而是:
MOV 能不能转成 MP4?
或者:
这个视频 2GB,能不能压到几百 MB?
又或者:
为什么视频格式看起来一样,有的设备能播,有的不能?
从产品角度看,这些需求很简单。
但从技术角度看,一个视频文件背后至少涉及:
- Container
- Video Codec
- Audio Codec
- Resolution
- Frame Rate
- Bitrate
- Duration
- Color Space
- HDR
- Rotation
- Metadata
- Keyframe
- Audio Track
- Subtitle Track
所以:
“视频格式转换”从来不只是改扩展名。
这篇就从一个文件管理 App 的角度,系统拆解 iOS 视频转换和压缩的完整架构。
1. MP4 和 H.264 不是一回事
这是视频领域最容易混淆的问题之一。
很多用户会说:
把视频转成 H.264。
也有人说:
把 H.264 转成 MP4。
实际上:
MP4
通常指:
Container
而:
H.264
通常指:
Video Codec
可以简单理解成:
MP4 Container
│
├── Video Track
│ └── H.264
│
├── Audio Track
│ └── AAC
│
└── Metadata
所以:
.mp4
只是一个“盒子”。
盒子里面的视频可以使用不同 Codec。
2. MOV 也是 Container
Apple 生态里经常遇到:
.mov
MOV 本质上也是一种容器格式。
里面可能是:
MOV
├── H.264
└── AAC
也可能:
MOV
├── HEVC
└── AAC
所以:
MOV → MP4
有时候可以:
不重新编码视频。
只需要:
Remux
也就是重新封装。
3. Remux 和 Transcode 完全不是一回事
假设:
movie.mov
内部已经是:
H.264 + AAC
目标:
movie.mp4
如果 MP4 容器能够承载现有 Track,
就可能:
MOV
↓
Read Tracks
↓
MP4
视频数据本身不重新压缩。
这叫:
Remux / Repackage
优点:
Fast
No Quality Loss
Low CPU
而 Transcode:
Decode
↓
Raw Frames
↓
Encode Again
成本要高很多。
4. Transcode 是什么?
例如:
HEVC
↓
H.264
就需要:
HEVC Decode
↓
Raw Video Frames
↓
H.264 Encode
或者:
4K
↓
1080p
也必须:
Decode
↓
Resize
↓
Encode
这就是:
Transcoding。
所以 VideoService 开始处理任务之前应该先问:
能不能直接 Remux?
如果可以:
不要重新编码。
5. 为什么 Remux 应该优先?
假设一个 10GB 视频。
重新编码可能需要:
Decode
+
Scale
+
Encode
带来:
- 大量 CPU / GPU 开销
- 电池消耗
- 发热
- 时间
- 质量损失
而 Remux:
Read Packet
↓
Write New Container
通常成本低很多。
所以可以设计:
Video Operation
↓
Can Remux?
/ \
Yes No
↓ ↓
Remux Transcode
这是视频工具非常重要的优化。
6. VideoInfo 应该先把文件分析清楚
就像图片处理有:
ImageInfo
视频也应该有:
struct VideoInfo {
let duration: TimeInterval
let width: Int
let height: Int
let frameRate: Double?
let bitrate: Int64?
let videoCodec: VideoCodec?
let audioCodec: AudioCodec?
let container: VideoContainer
let fileSize: Int64
}
UI 可以展示:
1920 × 1080
H.264
30 fps
8 Mbps
2.4 GB
这比只显示:
MP4
有用得多。
7. 文件后缀仍然不代表内部 Codec
例如:
movie.mp4
内部可能:
H.264
也可能:
HEVC
因此:
.mp4
并不能回答:
这个视频是不是 H.264?
需要读取:
Track Format Description
所以:
Extension
永远只能作为一层提示。
8. AVAsset 可以看作视频资产入口
在 iOS 视频处理中,一个非常核心的概念就是:
AVAsset
可以把它理解为:
一个音视频资源的抽象。
例如:
File URL
↓
AVAsset
然后可以获取:
Duration
Tracks
Metadata
Format
架构上:
FileItem
↓
VideoS
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/liuguofeng719/article/details/165355574




