RoaringKitty007头像
关注
iOS 视频格式转换与压缩怎么实现?从 AVFoundation、H.264 到码率与分辨率封面图

iOS 视频格式转换与压缩怎么实现?从 AVFoundation、H.264 到码率与分辨率

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

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--