“ 感知技术 · 感触CG · 感受艺术 · 感悟心灵 ”
中国很有影响力影视特效CG动画领域自媒体
本文转自公众号:虚幻引擎
我们将深入探究虚幻引擎的自动命令行编码器,了解如何让虚幻引擎自动在MRQ(影片渲染队列)中为你的图像做好编码。然后我们将学习ffmpeg的基础知识,包括如何将其安装到你的电脑,以及一些会经常使用的基本命令。
配合虚幻引擎的影片渲染队列使用ffmpeg
https://youtu.be/ZEvVqH1AnAw?si=kx5hMXmsa6-6al6S
什么是ffmpeg
· 简单来说,ffmpeg是一款免费且开源的命令行工具,可使用一系列命令库和程序来转换音频或视频格式。
如何获取ffmpeg?
· Epic并没有官方推荐的获取方式,也暂不计划提供ffmpeg的预编译二进制文件。
· 你可以通过以下渠道构建
o https://ffmpeg.org/releases/
o https://github.com/FFmpeg/FFmpeg
o https://ffmpeg.org/download.html
· 或者你也可以下载并安装预编译的二进制文件。有些编译版本是来自主分支,有些来自发布分支,因此请选择最适合你的版本。在本文档中,我们只说明Windows版本,但你也可以获得Mac和Ubuntu的构建版本。
o https://ffmpeg.org/download.html#build-windows 会显示两个站点
§ https://www.gyan.dev/ffmpeg/builds/
§ https://github.com/BtbN/FFmpeg-Builds/releases
§ 两者都可以使用,但如果你是新手比较迷茫,可以选择这个
§ https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-essentials.zip
虚幻引擎中的命令行编码器
如果你是第一次在MRQ中加载命令行编码器导出,你会在用户界面底部看到一堆的警告。这些警告会要你在项目设置中完成一些设置,如ffmpeg可执行文件的路径、视频/音频编解码器和容器/文件扩展名。
你可以在 “项目设置(Project Settings)” -> “影片管线CLI编码器(Movie Pipeline CLI Encoder)” 中进行设置
在编解码器帮助文本中,你会看到一个运行提示:
也就是cmd中的 “MovieRenderPipeline.DumpCLIEncoderCodecs” ,它可以显示所有可用的编解码器。如果你在默认设置下运行此命令,但没有上述任何信息,那就会出现错误,因为虚幻引擎不会自动得知在哪里可以找到你的命令行编码器的安装位置。因此,你可以直接选择可执行文件的路径:
或者如果你已经把它添加到了你的环境变量路径,那就可以直接在这里输入 ffmpeg.exe 。
最后,你可以直接把ffmpeg.exe可执行文件放在用于启动引擎的可执行文件旁边。
比如,把ffmpeg.exe放在这里:
C:\Program Files\Epic Games\UE_5.3\Engine\Binaries\Win64
在cmd中运行 “MovieRenderPipeline.DumpCLIEncoderCodecs” ,如果虚幻引擎能转储出大量的编解码器信息,就说明它找到了ffmpeg,因为这是ffmpeg的直接转储。引擎并不会在这里存储任何信息,而是直接向ffmpeg请求这些信息。
将引擎连接到ffmpeg后,你需要指定所需的视频和音频编解码器以及容器文件的扩展名。这里需要注意,并非所有文件扩展名(容器)都支持所有类型的编解码器。相关信息可以查询谷歌/维基。比较流行的配置是带有 h264 视频编解码器和 aac 音频编解码器的 mp4 文件,所以如果你是新手,还是先从这种配置开始吧。请注意,并非所有编解码器都是开源和/或免费的。
如果你还不太熟悉容器和编解码器的概念,不妨先稍微了解一下。不过基本上一个视频文件通常由一个或多个视频流、一个或多个音频流以及一些元数据组合而成。在大多数情况下,我们可以把视频文件看作是一个包含编码视频流、编码音频流和元数据的容器。
实用链接
·视频格式、编解码器及容器(已说明)
在MRQ “质量(Quality)” 下拉菜单中可以找到质量设置,里面有编解码器设置: “低(Low)、中(Med)、高(High)、极高(Epic)” 。所以用户可以根据情况来调整设置,决定速度/质量的取舍。 CRF 指的是目标质量。数字越小质量越高,但编码速度会越慢。这个数字的范围是1-51。如果编码器允许/要求,还可以使用比特率。因此,这里可以使用 -b:v 标志。
如果你想查看从虚幻引擎传递给ffmpeg的具体命令行,可以在启用命令行编码器运行渲染后,在输出日志中查看该命令,渲染完成后就可以找到了。
如果你遇到了错误,但又找不到原因,上面的操作可以帮助你排除故障。如果你确实想从命令提示符中运行该命令,则需要保留虚幻引擎在运行ffmpeg命令时生成的临时.txt文件。这种.txt文件是一种文本文件,其中会包含了所有渲染帧的列表。在命令行中输入 -f concat 可以告诉它要连接这些文件。
要阻止虚幻引擎在生成视频文件后删除这种文本文件,你需要在MRQ的“调试选项(Debug Options)”设置中启用 “编写所有采样(Write All Samples)” 。
这样你就可以用命令提示符排除故障,也更容易看到问题的全貌,错误本身也不会被其他渲染输出掩盖。
缩放示例
在MRQ中,你还可以给每个镜头添加额外的命令行参数,例如缩放输出。假如你渲染的是4K图像序列,但你想要的是高清mp4。只要在命令提示符中添加简单的ffmpeg命令,如下所示:
ffmpeg -v error -y -i "C:/Users/ShaunComly/Desktop/test/BALL/BALL.%04d.jpeg" -r 30.000000 -acodec aac -vcodec libx264 -crf 16 -vf scale=1920x1080 C:/Users/ShaunComly/Desktop/test/BALL/BALL.mp4
我们可以在命令行中使用 ffprobe 来探测该文件,确保它用的是我们想要的分辨率。
ffprobe -v C:/Users/ShaunComly/Desktop/test/BALL/BALL.mp4 -show_format -show_streams -print_format json
为了在引擎中执行此操作,你需要在MRQ的“额外命令行参数(Additional Command Line Args)”中添加缩放参数。
你还需要确保{AdditionalLocalArgs}格式字符串靠近输出命令,因为我们要更改的是输出而不是输入。
-hide_banner -y -loglevel error {VideoInputs} {AudioInputs} -acodec {AudioCodec} -vcodec {VideoCodec} {Quality}{AdditionalLocalArgs}{OutputPath}
根据你想要传递的参数,你需要在 “项目设置(Project Settings)” 中重新定位该变量的位置。在这个缩放示例中,由于这是一条单一的输出命令(不是输入命令),因此必须将参数移到命令行中输入后的位置。
输入命令(默认):
-hide_banner -y -loglevel error{AdditionalLocalArgs}{VideoInputs} {AudioInputs} -acodec {AudioCodec} -vcodec {VideoCodec} {Quality} {OutputPath}
输出命令:
-hide_banner -y -loglevel error {VideoInputs} {AudioInputs} -acodec {AudioCodec} -vcodec {VideoCodec} {Quality}{AdditionalLocalArgs}{OutputPath}
许多情况下可以放在这里:
-hide_banner -y -loglevel error {VideoInputs} {AudioInputs} {AdditionalLocalArgs} -acodec {AudioCodec} -vcodec {VideoCodec} {Quality} {OutputPath}
总而言之,这个格式字符串的位置非常重要。
如果你可以确定整个项目 始终 都是高清mp4,可以直接在 “项目设置(Project Settings)” 的 “命令行格式(Command Line Format)” 中进行设置,而不必在镜头层级上进行任何更改。
-hide_banner -y -loglevel error {AdditionalLocalArgs} {VideoInputs} {AudioInputs} -acodec {AudioCodec} -vcodec {VideoCodec} {Quality} -vf scale=1920x1080 {OutputPath}
我们还可以通过查看输出日志中的命令,验证命令行参数是否正确地从引擎传出并传入ffmpeg,以及使用ffprobe来确认分辨率。输出日志命令看起来一切正常:
LogMovieRenderPipelineIO: Final Command Line Arguments: -hide_banner -y -loglevel error -f concat -safe 0 -i C:/Users/ShaunComly/Desktop/test/BALL/1FDD2B9F4B582388565537947EC9F43C_input.txt -r 30.000000 -acodec aac -vcodec libx264 -crf 16 -vf scale=1920x1080 C:/Users/ShaunComly/Desktop/test/BALL/BALL.mp4
现在我们已经知道,ffmpeg会对命令行中的参数顺序有所要求,因此如果要执行比缩放输出更复杂的操作,那要么在引擎外执行,要么劫持{AdditionalLocalArgs}并在序列层级编写更复杂的命令行。只是使用格式字符串时不会自动化了。
烧入示例
举个例子,如果你想在已渲染的jpg序列上叠加烧入渲染通道,那么命令提示符中的ffmpeg命令行如下:
ffmpeg -v error -y -i "C:/Users/ShaunComly/Desktop/test/BALL/BALL.%04d.jpeg" -i "C:/Users/ShaunComly/Desktop/test/BALL/BALL.BurnInOverlay.%04d.png" -filter_complex "overlay" -r 30.000000 -acodec aac -vcodec libx264 -crf 16 C:/Users/ShaunComly/Desktop/test/BALL/shaunTest.mp4
为了在引擎中执行此操作,你需要在MRQ的“额外命令行参数(Additional Command Line Args)”中添加:
-i "C:/Users/ShaunComly/Desktop/test/BALL/BALL. BurnInOverlay. %04d.png" -filter_complex "overlay"
然后在 “项目设置(Project Settings)” 中设置 “命令行格式(Command Line Format)” ,然后{AdditionalLocalArgs}格式字符串要位于输入字符串之后、编解码器声明之前,这是为了方便 filter_complex 调用,因为它使用的所有输入前都需要先实现调用。项目设置中的默认位置会导致调用中断。
一般设置为:
-hide_banner -y -loglevel error {VideoInputs} {AudioInputs} {AdditionalLocalArgs} -acodec {AudioCodec} -vcodec {VideoCodec} {Quality} {OutputPath}
缩放及烧入示例
再假如你想叠加烧入(burn in)并且缩放输出。常见的ffmpeg命令如下:
ffmpeg -v error -y -i "C:/Users/ShaunComly/Desktop/test/BALL/BALL.FinalImage.%04d.jpeg" -i "C:/Users/ShaunComly/Desktop/test/BALL/BALL.BurnInOverlay.%04d.png" -filter_complex "overlay[4K_in];[4K_in]scale=1920:1080[hdOut]" -map [hdOut] hd.mp4
为了在引擎中执行此操作,你需要在MRQ的 “额外命令行参数(Additional Command Line Args)” 中添加:
-i "C:/Users/ShaunComly/Desktop/test/BALL/BALL.BurnInOverlay.%04d.png" -filter_complex "overlay[4K_in];[4K_in]scale=1920:1080[hdOut]" -map [hdOut]
同样地,在“项目设置(Project Settings)”中,确保 {AdditionalLocalArgs} 在编解码器声明之前,并且要在声明输入的引擎格式字符串之后。
多个流、缩放、编解码器以及文件类型示例
那假如我们想疯狂一点呢?如果我们想要一个带有烧入的高清mp4做样片,一个烧入了时间码的720 mxf供剪辑使用,以及一个4K ProRes Quicktime成片供导演在Macbook上查看呢?这样的要求可能超出了虚幻引擎中这一工具预计的功能范围,进入了外部管线的领域,不过我们还是可以试试能否实现。
而常见的ffmpeg命令行也变得复杂了:
ffmpeg -v error -y -i "C:/Users/ShaunComly/Desktop/test/BALL/BALL.FinalImage.%04d.jpeg" -i "C:/Users/ShaunComly/Desktop/test/BALL/BALL.BurnInOverlay.%04d.png" -filter_complex "overlay,split=3[mp4HD_in][mxf720_in][mov4K_in];[mp4HD_in]scale=1920:1080[mp4HD_out];[mxf720_in]scale=1280:720,"drawtext=fontfile='c\:/Windows/Fonts/courbd.ttf':text=:fontsize=60:x=(w-text_w)/2:y=(h-100):fontcolor=#000000:timecode='10\:00\:00\:00':rate=30000/1001"[mxf720_out];[mov4K_in]scale=3840:2160[mov4K_out]" -crf 16 -r 30 -vcodec prores -map [mov4K_out] C:/Users/ShaunComly/Desktop/test/BALL/MOV4K.mov -vcodec dnxhd -pix_fmt yuv422p -b:v 75M -map [mxf720_out] C:/Users/ShaunComly/Desktop/test/BALL/MXF720.mxf -acodec aac -vcodec libx264 -map [mp4HD_out] C:/Users/ShaunComly/Desktop/test/BALL/hdMP4.mp4
可以看到这串命令很长,毕竟虚幻引擎中仅有的几种格式字符串可能不足以“优雅”地执行这种操作。我们仍然可以执行这个功能,只是不得不硬编码更多的东西。要在引擎中执行此操作,我们可以在 “项目设置(Project Settings)” 中移除 “命令行格式(Command Line Format)” 的整个后端。
-hide_banner -y -loglevel error {VideoInputs} {AudioInputs} {AdditionalLocalArgs}
还要在MRQ的序列层上声明整个命令行的后端:
-i "C:/Users/ShaunComly/Desktop/test/BALL/BALL.BurnInOverlay.%04d.png" -filter_complex "overlay,split=3[mp4HD_in][mxf720_in][mov4K_in];[mp4HD_in]scale=1920:1080[mp4HD_out];[mxf720_in]scale=1280:720,"drawtext=fontfile='c\:/Windows/Fonts/courbd.ttf':text=:fontsize=60:x=(w-text_w)/2:y=(h-100):fontcolor=#000000:timecode='10\:00\:00\:00':rate=30000/1001"[mxf720_out];[mov4K_in]scale=3840:2160[mov4K_out]" -crf 16 -r 30 -vcodec prores -map [mov4K_out] C:/Users/ShaunComly/Desktop/test/BALL/MOV4K.mov -vcodec dnxhd -pix_fmt yuv422p -b:v 75M -map [mxf720_out] C:/Users/ShaunComly/Desktop/test/BALL/MXF720.mxf -acodec aac -vcodec libx264 -map [mp4HD_out] C:/Users/ShaunComly/Desktop/test/BALL/hdMP4.mp4
但是如果你现在在引擎中这样做,你会得到意外的结果。这是因为引擎会自动为每个激活的渲染通道运行一条命令行。由于我们同时激活了bty和烧入两个通道,所以引擎会运行两个单独的ffmeg命令,一个以bty通道作为 {VideoInput} 变量,另一个以烧入作为 {VideoInput} 变量。
查看一下输出日志,我们可以看到两条连续的命令:
BTY
LogMovieRenderPipelineIO: Final Command Line Arguments: -hide_banner -y -loglevel error -f concat -safe 0 -i C:/Users/ShaunComly/Desktop/test/BALL/B397EBF845D3670B6E31D3853B0CFF77_input.txt -i "C:/Users/ShaunComly/Desktop/test/BALL/BALL.BurnInOverlay.%04d.png" -filter_complex "overlay,split=3[mp4HD_in][mxf720_in][mov4K_in];[mp4HD_in]scale=1920:1080[mp4HD_ out];[mxf720_in]scale=1280:720[mxf720_out];[mov4K_in]scale=3840:2160[mov4K_out]" -crf 16 -r 30 -vcodec prores -map [mov4K_out] C:/Users/ShaunComly/Desktop/test/BALL/MOV4K.mov -vcodec dnxhd -pix_fmt yuv422p -b:v 75M -map [mxf720_out] C:/Users/ShaunComly/Desktop/test/BALL/MXF720.mxf -acodec aac -vcodec libx264 -map [mp4HD_out] C:/Users/ShaunComly/Desktop/test/BALL/BALL.FinalImage.mp4
烧入
LogMovieRenderPipelineIO: Generated Path 'C:/Users/ShaunComly/Desktop/test/BALL/F2CC8CF345A3F30D414A4BA1DB4E205F_input.txt ' for input data. LogMovieRenderPipelineIO: Final Command Line Arguments: -hide_banner -y -loglevel error -f concat -safe 0 -i C:/Users/ShaunComly/Desktop/test/BALL/F2CC8CF345A3F30D414A4BA1DB4E205F_input.txt -i "C:/Users/ShaunComly/Desktop/test/BALL/BALL.BurnInOverlay.%04d.png" -filter_complex "overlay,split=3[mp4HD_in][mxf720_in][mov4K_in];[mp4HD_in]scale=1920:1080[mp4HD_ out];[mxf720_in]scale=1280:720[mxf720_out];[mov4K_in]scale=3840:2160[mov4K_out]" -crf 16 -r 30 -vcodec prores -map [mov4K_out] C:/Users/ShaunComly/Desktop/test/BALL/MOV4K.mov -vcodec dnxhd -pix_fmt yuv422p -b:v 75M -map [mxf720_out] C:/Users/ShaunComly/Desktop/test/BALL/MXF720.mxf -acodec aac -vcodec libx264 -map [mp4HD_out] C:/Users/ShaunComly/Desktop/test/BALL/BALL.BurnInOverlay.mp4
在这种情况下,第一条命令可以很好地运行,并生成我们需要的视频。但当运行第二条ffmpeg命令时,由于替换了 {VideoInput} 变量,引擎就会用烧入重叠覆盖这些文件。
如果你禁用烧入渲染通道并重新运行,然后就能正常工作了,我们可以通过检查引擎发送给ffmpeg的命令输出日志来验证一下:
LogMovieRenderPipelineIO: Final Command Line Arguments: -hide_banner -y -loglevel error -f concat -safe 0 -i C:/Users/ShaunComly/Desktop/test/BALL/16A66B11478EEC2FC6045B942081D80D_input.txt -i "C:/Users/ShaunComly/Desktop/test/BALL/BALL.BurnInOverlay.%04d.png" -filter_complex "overlay,split=3[mp4HD_in][mxf720_in][mov4K_in];[mp4HD_in]scale=1920:1080[mp4HD_ out];[mxf720_in]scale=1280:720,"drawtext=fontfile='c\:/Windows/Fonts/courbd.ttf':text=:fontsize= 60:x=(w-text_w)/2:y=(h-100):fontcolor=#000000:timecode='10\:00\:00\:00':rate=30000/1001"[mx f720_out];[mov4K_in]scale=3840:2160[mov4K_out]" -crf 16 -r 30 -vcodec prores -map [mov4K_out] C:/Users/ShaunComly/Desktop/test/BALL/MOV4K.mov -vcodec dnxhd -pix_fmt yuv422p -b:v 75M -map [mxf720_out] C:/Users/ShaunComly/Desktop/test/BALL/MXF720.mxf -acodec aac -vcodec libx264 -map [mp4HD_out] C:/Users/ShaunComly/Desktop/test/BALL/BALL.BurnInOverlay.mp4
然后对相应的文件做ffprobe:
· ffprobe -v error C:/Users/ShaunComly/Desktop/test/BALL/MOV4K.mov -show_format -show_streams -print_format json
· ffprobe -v error C:/Users/ShaunComly/Desktop/test/BALL/hdMP4.mp4 -show_format -show_streams -print_format json
· ffprobe -v error C:/Users/ShaunComly/Desktop/test/BALL/MXF720.mxf -show_format -show_streams -print_format json
效果并不理想,但这只是该工具的第一次迭代,因此我们还有改进的空间。
内部工具改进请求:
· 为每个渲染通道设置“跳过编码(Skip Encode)”选项。现在它会自动强制对所有渲染流程进行编码。
· 将{AdditionalLocalArgs}的位置移到命令行中编解码器声明的前方。
· 在每个渲染通道的渲染通道层上都有一个“添加到视频输入(Add to Video Inputs)”选项。在叠加烧入的情况下,你可以将烧入渲染通道添加到视频输入,而无需对渲染进行硬路径设置。
· 在MRQ的序列/镜头层上会有可选的视频/音频输入字符串,你可以用它来添加外部参考图像或公司的水印。
· 我们还能够在序列/镜头层调用 {OutputPath} 。因此,如果无法选择按通道切换,你可以使用类似 {OutputPath}BALL.BurnInOverlay.%04d.png 的方式添加到输入中。
基础ffmpeg参考ffprobe
文档 - https://ffmpeg.org/ffprobe.html
1.显示一切信息及日志-ffprobe movieName.mp4
2.抑制日志及错误 -ffprobe -v error movieName.mp4
3.打印媒体格式信息-ffprobe -v error movieName.mp4 -show_format
4.显示文件中所有的流 -ffprobe -v error movieName.mp4 -show_format -show_streams
5.可以使用csv、xml等格式写入类型-ffprobe -v error movieName.mp4 -show_format -show_streams -print_format json
6.只显示视频流-ffprobe -v error movieName.mp4 -show_streams -select_streams v
7.只显示编解码器名称及抑制打印验证器的信息-ffprobe -v error movieName.mp4 -select_streams v -show_entries stream=codec_name -print_format default=noprint_wrappers=1
8.显示视频流信息但不下载 -ffprobe -v error https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/1080/Big_Buck_Bunny_1080_10s_10MB.mp4 -show_format -show_streams -print_format json
9.如何探测并查看比特率 -ffprobe -v error movie.mov -select_streams v -show_entries stream=codec_name,bit_rate -print_format default=noprint_wrappers=1
10.只需将-select_streams v替换为a,就能在运行时看到音频编码器 -ffprobe -v error transcoded.mxf -select_streams a -show_entries stream=codec_name -print_format default=noprint_wrappers=1
ffplay
文档 - https://ffmpeg.org/ffplay.html
1.抑制日志和错误并播放影片 -ffplay -v error movieName.mp4
2.调整视频大小并隐藏标题栏 -ffplay -v error movieName.mp4 -x 600 -y 600 -noborder
3.自动计算高度以获得合适的长宽比 -ffplay -v error movieName.mp4 -x 600 -noborder
4.将视频放入显示器 -ffplay -v error movieName.mp4 -x 600 -y 600 -noborder -top 0 -left 0
5.全屏ffplay -v error movieName.mp4 -fs -noborder
6.-an-- 关闭音频
7.-vn-- 关闭视频
8.-loop-- 一直循环,不过可以输入循环次数
9.按下W-- 播放时按下会循环显示模式
10.S-- 逐帧播放
11.方向键-- 跳帧
12.从网页播放媒体- ffplay -v error https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/1080/Big_Buck_Bunny_1080_10s _10MB.mp4 -noborder -y 600
ffmpeg
文档 - https://ffmpeg.org/ffmpeg.html
编码
1.如何查看所有可用的编码器 -ffmpeg -encoders
2.转换编码为mxf -ffmpeg -v error -y -i movie.mov transcoded.mxf
3.用h264编码器转换编码为mxf -ffmpeg -v error -y -i movie.mov -vcodec libx264 transcoded.mxf
4.设置音频编码器 -ffmpeg -v error -y -i movie.mov -vcodec libx264 -acodec libmp3lame transcoded.mp4
5.CRF为目标质量。数字越小越质量越高,范围为1-51。默认情况下,libx264选择的-crf质量为23,基本就够了。以下是指定CRF值的方法 -ffmpeg -v error -y -i movie.mov -vcodec libx264 -crf 10 transcoded.mp4
6.如何指定比特率而不是crf -ffmpeg -v error -y -i movie.mov -vcodec libx264 -acodec 2M transcoded.mp4
7.2通道编码或2通道ABR -ffmpeg -v error -y -i movie.mov -vcodec libx264 -b:v 2M -pass 1 -f null /dev/null && ffprobe -v error transcoded.mp4 -select_streams v -show_entries stream=codec_name,bit_rate -print_format default=noprint_wrappers=1
8.使用编码器预设 -ffmpeg -v error -y -i movie.mov -vcodec libx264 -preset ultrafast transcoded.mp4
修剪
1.你可以使用时间码修剪-ss为开始时间,-to为结束时间 -ffmpeg -y -v error -i vidIn.mp4 -ss 00:03:55.000 -to 240.0 vidOut.mp4
2.或者用-t设置持续时间(以秒记)。你可以使用以下两种方法之一:ffmpeg -y -v error -i vidIn.mp4 -ss 00:03:55.000 -t 5 vidOut.mp4
合并/衔接
1.你必须创建一个文本文件,并列出要合并的所有视频。-f concat可以连接视频 -ffmpeg -y -v error -f concat -i list.txt merged.mp4
生成缩略图
1.输入第一帧作为缩略图 -ffmpeg -v error -i movie.mp4 -vframes 1 thumbnail.jpg
2.设置具体宽度/高度 -ffmpeg -v error -i movie.mp4 -vframes 1 -vf scale=320:180 thumbnail.jpg
3.在视频的第5秒进行拍摄 -ffmpeg -v error -i movie.mp4 -ss 5 -vframes 1 -vf scale=320:180 thumbnail.jpg
4.会每秒生成一帧 -ffmpeg -v error -i movie.mp4 -vf fps=1,scale=320:180 thumbnails.%04d.jpg
缩放
1.缩放分辨率 -ffmpeg -v error -i movie_4k.mp4 -vf scale=1280:720 -f movie_720.mp4
2.探测分辨率缩放 -ffprobe movie_4k.mp4 -v error -select_streams v -show_entries stream=width,height
3.缩放分辨率但保留长宽比 -ffmpeg -v error -i movie_4k.mp4 -vf scale=-1:480 -f movie_480.mp4
4.在上述情况中,你可能会遇到“要被2整除”的问题,因为在X分辨率下产生的是奇数。在这种情况下,你需要使用2 -ffmpeg -v error -i movie_4k.mp4 -vf scale=-2:480 movie_480.mp4
5.强制使用视频分辨率,超出部分用黑框而不是拉伸像素,“ ow-iw ”和“ oh-ih ”表示“output/input width/height” -ffmpeg -v error -y -i movie_4k.mp4 -vf "scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2" movie_forced2.mp4
叠加
叠加命令需要两个或多个输入。第一个输入是BG视频,其他输入是“overlay”(叠加)。
1. 简单叠加(在下面的示例中,你可以在命令行末尾添加一个ffplay示例,以便快速检查) -ffmpeg -v error -y -i movie.mov -i logo.png -filter_complex "overlay" out.mp4 && ffplay out.mp4 -v error -an -top 0 -y 875
2.要编辑叠加位置 -ffmpeg -v error -y -i movie.mov -i logo.png -filter_complex "overlay=x=main_w-overlay_w-50:y=50" out.mp4
3.使叠加效果略微透明,就像水印一样 -ffmpeg -v error -y -i movie.mov -i logo.png -filter_complex "[1:v]colorchannelmixer=aa=0.4[transparent_logo];[0:v][transparent_logo]overlay=x=mai n_w-overlay_w-50:y=50" out.mp4
4.缩放标记(-1:100,-1表示从Y分辨率中提取适当的X分辨率,同时保持原长宽比) -ffmpeg -v error -y -i movie.mov -i logo.png -filter_complex "[1:v]scale=-1:100[smaller_logo];[0:v][smaller_logo]overlay=x=main_w-overlay_w-50:y=5 0" out.mp4
5.添加第二个叠加层并放置在视频的右下角 -ffmpeg -v error -y -i movie.mov -i logo.png -i logoTwo.png -filter_complex "[1:v]scale=-1:100[smaller_logo];[0:v][smaller_logo]overlay=x=main_w-overlay_w-50:y=5 0[after_one_logo];[after_one_logo][2:v]overlay=W-w-50:H-h-50" out.mp4
6.将视频作为叠加层而不是静态图片 -ffmpeg -v error -y -i movie.mov -i logo.png -i movieTwo.mp4 -filter_complex "[1:v]scale=-1:100[smaller_logo];[0:v][smaller_logo]overlay=x=main_w-overlay_w-50:y=5 0[after_one_logo];[2:v]scale=-1:400[smaller_movie2];[after_one_logo][smaller_movie2]o verlay=W-w-50:H-h-50" out.mp4
提取文本或时间码
1.这里你不用生成实际文件来测试。在创建实际文件之前,你可以使用与ffmpeg相同的命令来查看ffplay的效果。这样可以在测试时节省步骤 -ffplay movie.mov -v error -an -top 240 -y 835 -vf "drawtext=fontfile='c\:/Windows/Fonts/courbd.ttf':text=TEST"
2.要固定字体大小和位置 -ffplay movie.mov -v error -an -top 240 -y 835 -vf "drawtext=fontfile='c\:/Windows/Fonts/courbd.ttf':text=TEST:fontsize=48:x=100:y=100"
3.fontsize=h/2意味着字体大小为视频高度的一半,x=(w-text_w)/2表示文本在视频水平居中位置,y=(h-text_h)/2表示文本在视频垂直居中位置,fontcolor=green
4.或使用非零的alpha黑色编码fontcolor=#000000AA-ffplay movie.mov -v error -an -top 240 -y 835 -vf "drawtext=fontfile='c\:/Windows/Fonts/courbd.ttf':text=TEST:fontsize=h/2:x=(w-text_w)/2: y=(h-text_h)/2:fontcolor=green"
5.要限制文本出现间隔时间 -ffplay movie.mov -v error -an -top 240 -y 835 -vf "drawtext=fontfile='c\:/Windows/Fonts/courbd.ttf':text=TEST:fontsize=h/2:x=(w-text_w)/2: y=(h-text_h)/2:fontcolor=#000000AA:enable='between(t,1,3)'"
6.要让文本随时间从底部向上滚入 -ffplay movie.mov -v error -an -top 240 -y 835 -vf "drawtext=fontfile='c\:/Windows/Fonts/courbd.ttf':text=TEST:fontsize=h/2:x=(w-text_w)/2: y=(h-t*200)/2:fontcolor=#000000AA"
7.要运行时间码,必须清除文本并设置帧率 -ffplay movie.mov -v error -an -top 240 -y 835 -vf "drawtext=fontfile='c\:/Windows/Fonts/courbd.ttf':text=TEST:fontsize=60:x=(w-text_w)/2:y =(h-100):fontcolor=#000000:timecode='10\:00\:00\:00':rate=30000/1001"
8.在时间码周围绘制边界框 -ffplay movie.mov -v error -an -top 240 -y 835 -vf "drawtext=fontfile='c\:/Windows/Fonts/courbd.ttf':text=TEST:fontsize=60:x=(w-text_w)/2:y =(h-100):fontcolor=#000000:timecode='10\:00\:00\:00':rate=30000/1001:box=1:boxborde rw=15:boxcolor=#ffffff44"
提取音频通道
1.探测音频文件 -ffprobe -v error two-stereo-tracks.m4a -select_streams a -show_entries stream=index,codec_name,channels -print_format json
2.将来自不同音频流的通道合并到一个文件中 -ffmpeg -y -v error -i two-stereo-tracks.m4a -filter_complex "amerge=inputs=2" four-channels-one-stream.m4a
3.获取所有四个音频流,将它们分别分割成单通道,并导出为单独的文件 -ffmpeg -y -v error -i two-stereo-tracks.m4a -filter_complex "amerge=inputs=2,asplit=4[all0][all1][all2][all3];[all0]pan=mono|c0=c0[ch0];[all1]pan=mon o|c0=c1[ch1];[all2]pan=mono|c0=c2[ch2];[all3]pan=mono|c0=c3[ch3]" -map [ch0] ch0.m4a -map [ch1] ch1.m4a -map [ch2] ch2.m4a -map [ch3] ch3.m4a
组合/或者音频通道
1.一个流,四个通道 -ffmpeg -v error -y -i ch0.m4a -i ch1.m4a -i ch2.m4a -i ch3.m4a -filter_complex "amerge=inputs=4" one-stream-four-channels.m4a
2.一个流,将所有四个通道组合到一个通道 -ffmpeg -v error -y -i ch0.m4a -i ch1.m4a -i ch2.m4a -i ch3.m4a -filter_complex "amix=inputs=4" one-stream-one-channels.m4a
3.使用“声相(Pan)”滤波器可以在不降低音量的情况下更好地混音 -ffmpeg -v error -y -i ch0.m4a -i ch1.m4a -i ch2.m4a -i ch3.m4a -filter_complex "amix=inputs=4,pan=mono|c0=c0+c1+c2+c3" pan-mono.m4a
4.提高/降低通道的音量 -ffmpeg -v error -y -i ch0.m4a -i ch1.m4a -i ch2.m4a -i ch3.m4a -filter_complex "amix=inputs=4,pan=mono|c0=0.5*c0+1.5*c1+0.5*c2+1.5*c3" pan-mono.m4a
5.创建立体声文件并指定通道传输位置 -ffmpeg -v error -y -i ch0.m4a -i ch1.m4a -i ch2.m4a -i ch3.m4a -filter_complex "amix=inputs=4,pan=stereo|FL=c0+c2|FR=c1+c3" pan-stereo.m4a
全文完
文字描述生成3D人物动画已经这么丝滑了么?
宝可梦宣布调查《幻兽帕鲁》的侵权行为!超强法务部要来了
在UE中实时物理模拟铁链
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.