ffmpeg:gif转mov

2022-08-06,

gif转mov

  • 缘由
  • 像素图缩放
  • gif转视频
  • 调整坐标
  • 画面 翻转
  • 画面 旋转
  • 处理时长
  • gif同框
  • 在ae中的实现
  • 结语

有些网站可以将gif转成mp4和mov,不用安装额外的软件,windows和mac上都能操作,操作便捷,使用方便,如无特殊要求,此类网站即可满足!

缘由

使用ffmpeg来转mov,主要是为了解决遇到的特定问题
1、部分软件不支持gif,笔者使用达芬奇做视频,它目前还不支持导入gif;
2、缩放,手头的gif尺寸小,都是像素风格的,大概30x30px的样子,工程设置是1080p(1920x1080),gif要被放大10倍,放大后图像超级模糊;
3、透明度,手头的gif带有透明度,导入到剪辑软件中要保留透明度,对gif进行背景抠像是下下策;
4、大小和位置,指定gif画面的宽高和坐标;

大致思路:
1、转成mp4,就可以导入剪辑软件了;
2、ps调整图像大小时,可以设置采样选项,再不济用ps做缩放处理;
3、将gif转成png序列,这样导入剪辑软件就有透明度了;
4、在设计软件中调好坐标,导出效果图,导入剪辑软件后对照着调整各元素的大小和位置,能做到大致的精确;

像素图缩放

原图是 28x22px 麻雀扇动翅膀的gif动画,ps里将尺寸调到280x220(10倍)。
在“重新采样”中发现“邻近(硬边缘)”显示效果最好,像素块清晰明确,其它的都是模糊的,这个采样方案就是目标了。

下方的动图就是原始的gif,直接鼠标右键“图片另存为”,可以下载到。该文件提取自某像素游戏,仅供学习交流用!

通过搜索引擎找到了ffmpeg缩放采样参数
```shell
ffmpeg -y -hide_banner \
-i /Users/hf/Desktop/Finch.png \
-vf "scale=iw*10:ih*10" \
-sws_flags "neighbor" \
/Users/hf/Desktop/Finch_scale10.png
```
笔者主力系统是mac,windows上稍作修改也能运行,cmd命令是这样的:
```bash
ffmpeg -y -hide_banner ^
-i "D:\Finch.png" ^
-vf "scale=iw*10:ih*10" ^
-sws_flags "neighbor" ^
"D:\Finch_scale10.png"
```
参数解析:
iw*10 图片的宽度放大10倍(input width)
ih*10 图片的高度放大10倍(input height)
-sws_flags 缩放采样方案,用的是的“neighbor”(邻近),[sws_flags更多参数](http://www.ffmpeg.org/ffmpeg-scaler.html#toc-Scaler-Options)
“\”、“^”是续行符,一行脚本内容太长,就用续行符来换行处理,以提高脚本的可读性
“\”是mac上的,“^是window上

gif转视频

mp4是不是也能带透明度呢,听起来有点异想天开!

Apple ProRes 4444 XQ 和Apple ProRes4444非常适合动态图形媒体的交换,因为他们几乎是无损的,也是唯一支持alpha通道的Apple ProRes编解码器。
Adobe系列软件在CC 2019及其后版本原生支持Apple ProRes(意味着windows 和 mac平台都能使用)

简单来说特定参数的mov,是支持透明度的。
下面是相应的ffmpeg参数

inFile="/Users/hf/Desktop/Finch.gif"
outFile="/Users/hf/Desktop/Finch.mov"
ffmpeg -y -i "${inFile}" \
-vcodec prores_ks -profile:v 4444 -pix_fmt yuva444p10le -alpha_bits 8 \
-acodec copy \
-vf "scale=iw*10:ih*10" \
-sws_flags "neighbor" \
-r 30 \
"${outFile}"

参数解析:
-vcodec prores_ks -profile:v 4444 -pix_fmt yuva444p10le -alpha_bits 8 是实现Apple ProRes444的核心参数

inFile 自定义变量(这种写法只在shell中有效)gif文件地址,mac上选中文件按 ⌘+⌥+C 可以快速拷贝文件地址
outFile 自定义变量,转换后的mov文件地址
-r 30 表示输出的mov是30帧每秒,如果剪辑工程是25帧,则改成25

调整坐标

缩放后的得到的mov,直接拖到达芬奇里,达芬奇会直接缩放到1080p(1920x1080px,剪辑工程画面尺寸),一般我的流程是在设计软件里缩放好并调好坐标,然后导入元素到剪辑软件里,如果mov的尺寸也是1080p,且gif画面在指定的坐标就完美了。

inFile="/Users/hf/Desktop/Finch.gif"
outFile="/Users/hf/Desktop/Finch_1080.mov"
ffmpeg -y -i "${inFile}" \
-vcodec prores_ks -profile:v 4444 -pix_fmt yuva444p10le -alpha_bits 8 \
-acodec copy \
-s 1920x1080 -r 30 \
-vf "scale=280:220,pad=1920:1080:0:0:0x00000000" \
-sws_flags "neighbor" \
"${outFile}"

参数解析:
-s 1920x1080 将mov的尺寸设置成1920x1080
scale=280:220 宽度:高度,如果你想将gif放大三倍可以写 scale=iw3:ih3

pad=1920:1080:0:0:0x00000000 对应填写 w:h❌y:color
1920:1080 宽高填写跟mov的尺寸保持一致
0:0 画面的x,y坐标
0x00000000 0x后面有8个0,表示背景是透明的(RGBA)

代码执行后gif画面会被缩放至 280x220,并位于画布的0:0(起始)位置

画面 翻转

目前发现可以对画面进行水平/垂直翻转

inFile="/Users/hf/Desktop/Finch.gif"
outFile="/Users/hf/Desktop/Finch_1080.mov"
ffmpeg -y -i "${inFile}" \
-vcodec prores_ks -profile:v 4444 -pix_fmt yuva444p10le -alpha_bits 8 \
-acodec copy \
-s 1920x1080 -r 30 \
-vf "hflip,scale=280:220,pad=1920:1080:0:0:0x00000000" \
-sws_flags "neighbor" \
"${outFile}"

参数解析:
-vf hflip 对画面进行水平翻转
hflipHorizontal Flip)水平翻转
vflipVertical Flip)垂直翻转

画面 旋转

那我能不能对画面进行旋转呢?

inFile="/Users/hf/Desktop/Finch.gif"
outFile="/Users/hf/Desktop/Finch_1080.mov"
ffmpeg -y -i "${inFile}" \
-vcodec prores_ks -profile:v 4444 -pix_fmt yuva444p10le -alpha_bits 8 \
-acodec copy \
-s 1920x1080 -r 30 \
-vf "rotate=PI/4,scale=280:220,pad=1920:1080:100:100:0x00000000" \
-sws_flags "neighbor" \
"${outFile}"

参数解析:
rotate=PI/4 顺时针旋转45°,PI=180°
pad=1920:1080

《ffmpeg:gif转mov.doc》

下载本文的Word格式文档,以方便收藏与打印。

  • [C#] FFmpeg 音视频开发总结
    [C#] FFmpeg 音视频开发总结

    为什么选择FFmpeg? 延迟低,参数可控,相关函数方便查询,是选择FFmpeg作为编解码器最主要原因,如果是处理实时流,要求低延迟,最好选择是FFmpeg。 如果需要用Opencv或者C#的Emgucv这种库来处理视频流,也多是...

    2023-07-29编程代码,,
  • ffmpeg初体验
    ffmpeg初体验

    ffmpeg是一个多平台多媒体处理工具,处理视频和音频的功能非常强大。目前在网上搜到的iOS上使用FFMPEG的资料都比较陈旧,而FFMPEG更新迭代比较快; 且网上的讲解不够详细,对于初次接触FFMPEG的新手(例如我)来...

    2023-07-29编程代码,
  • FFmpeg深入分析之零-基础
    FFmpeg深入分析之零-基础

    FFmpeg是相当强大的多媒体编解码框架,在深入分析其源代码之前必须要有基本的多媒 体基础知识,否则其源代码会非常晦涩难懂。本文将从介绍一些基本的多媒体只是,主要是为研读ffmpeg源代码做准备,比如一些编解码...

    2023-07-29编程代码,,
  • FFmpeg Basics学习笔记(1)ffmpeg基础
    FFmpeg Basics学习笔记(1)ffmpeg基础

    1 FFmpeg的由来 FFmpeg缩写中,FF指的是Fast Forward,mpeg是 Moving Pictures Experts Group的缩写。官网:ffmpeg.org 编译好的可执行程序也可以从官网上下载。当然你也可以自己搭建编译环境编译。 2 FFmpeg命令...

    2023-07-29编程代码,,
  • FFmpeg中的时间基(time_base), AV_TIME_BASE
    FFmpeg中的时间基(time_base), AV_TIME_BASE

    一. AV_TIME_BASE 经常在FFmpeg的代码中看到一个奇怪的单位 AV_TIME_BASE ,比如 AVFormatContext 结构体中就有这样一个字段: duration ,它在FFmpeg中的解释如下: /** * D...

    2023-07-29编程代码,,
  • FFmpeg深入分析(一)
    FFmpeg深入分析(一)

    最近在做一个关于监控的项目,要在iphone 客户端实现播放监控的实时视频以及录像视频。使用到了FFmpeg,看到这篇文章,写的非常不错。转自:http://blog.chinaunix.net/uid-26611383-id-3976154.html FFmpeg是相当...

    2023-07-29编程代码,
  • 理解ffmpeg中的pts,dts,time_base
    理解ffmpeg中的pts,dts,time_base

    首先介绍下概念: PTS:Presentation Time Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来 DTS:Decode Time Stamp。DTS主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码 也就是pts...

    2023-07-29编程代码,,
  • Ffmpeg分布式视频转码问题总结
    Ffmpeg分布式视频转码问题总结

    本文主要聊一聊云原生时代分布式转码系统实施过程中碰到的一些问题。 聊问题之前简单介绍一下我们的分布式转码方案。 云原生分布式转码 在计算资源招之即来的云计算时代,正在重构着软件架构的方方面面。 对软件...

    2023-06-26编程教程,,