准备向磁盘拷贝视频的时候发现拍摄的视频方向错了。然后准备旋转视频,但是我常用的QuickTime旋转只能导出HEVC和H264,无法导出ProRes。

然后准备用ffmpeg来旋转,发现ffmpeg旋转ProRes竟然还需要重新编码,同样是旋转视频,ProResH.264 的处理速度天差地别。H.264 几乎瞬间完成,而 ProRes 则可能要等上几分钟。这到底是为什么呢?于是我学习了一下ProRes的机制。

先看 ProRes:每一帧都是“完整图片”

ProRes 是一种高质量的视频格式,主要用在影视后期制作中。它有个特点:帧内编码,也就是说,视频里的每一帧就像一张独立的图片,都是完整的。这样设计的好处是,视频的每一帧都能单独处理,质量也非常高。

但是,问题来了。如果你想旋转这个视频,比如向右旋转 90 度,那每一帧的内容都得重新排列像素,最后还要重新保存为 ProRes 格式。这就相当于,你把一本很精美的画册每一页都翻过来重新排版,然后再装订好,肯定得花时间。

再看 H.264:聪明的“偷懒方式”

H.264 和 ProRes 不一样。它用的是 帧间编码,也就是说,并不是每一帧都是“完整的图片”。它会把变化的部分记录下来,比如“这一秒和上一秒相比,只多了一只小鸟飞过”。这样的视频数据更小,压缩更高效。

更神奇的是,H.264 的旋转信息其实就藏在视频元数据里。也就是说,你想旋转 90 度,FFmpeg 只需要改个标记告诉播放器:“播放时转一下就行了”,根本不用去动视频内容本身。所以,旋转 H.264 视频的时候,只需几秒就能完成。

为什么 ProRes 不能偷懒?

ProRes 的设计是为了保证画质,而不是为了省时间。它并不支持通过元数据保存旋转信息,所有的旋转操作都必须“动真格”,对每一帧重新计算、排列和编码。虽然耗时,但这也保证了最终的画质符合专业需求。

特点 ProRes H.264
编码方式 每帧是完整的图片(帧内编码) 只存变化部分(帧间编码)
旋转方式 每帧重新编码 修改元数据即可
处理速度 慢(需要逐帧处理) 快(无需重新编码)
应用场景 高质量后期制作、存储 流媒体播放、文件分发

转换方法

以确保电脑安装ffmpeg。如果没有安装可以查看安装教程。通过终端/命令行工具执行:

1
ffmpeg -i 输入的视频文件路径 -vf "transpose=1" -c:v prores_ks -c:a copy 输出的视频文件路径

例如:

1
ffmpeg -i "/Volumes/A001/A001_07250152_C003.mov" -vf "transpose=1" -c:v prores_ks -c:a copy output.mov

解释:

  • -vf “transpose=1” 表示顺时针旋转 90°。

  • -c:v prores_ks 保持输出为 ProRes 编码。

  • -c:a copy 保留音频原样,无需重新编码。

如果需要顺时针旋转 180° 或 270°,可以使用:

  • 顺时针 180°:-vf “transpose=2,transpose=2”

  • 顺时针 270°:-vf “transpose=2”

常见问题

为什么我的文件大了/小了?

因为涉及到了重新编码,ffmpeg自动的寻找了比较合适的码率进行转换(优先保证质量)。如果你想要固定码率或者是固定编码格式,就需要添加更多参数。并且可能会造成压缩的情况。