FFmpeg 入门

FFmpeg 入门

首页音乐舞蹈DJ混合器更新时间:2024-05-09
FFmpeg 简介ffmpeg命令行工具

ffplay -f lavfi -i testsrc -vf pad='400:300:(ow-iw)/2:(oh-ih)/2:orange'

FFmpeg软件库

常见 ffmepg 中的名词/缩写

已经给大家准备好了安装环境和各种视频资料,资料放在自己的群里面:832218493(需要自取)

正在跳转

ffmpeg 命令

ffmpeg [global_options] {[input_file_options] -i INPUT_FILE} ... {[output_file_options] OUTPUT_FILE}... // 比如: ffmpeg [参数1]global_options [参数2]input_file_options -i [参数3]INPUT_FILE [参数4]output_file_options [参数5]OUTPUT_FILE

命令的一些说明

_______ ______________ | | | | | input | demuxer | encoded data | decoder | file | ---------> | packets | ----- |_______| |______________| | v _________ | | | decoded | | frames | |_________| ________ ______________ | | | | | | | output | <-------- | encoded data | <---- | file | muxer | packets | encoder |________| |______________|显示输出预览

Filters, filterchains,filtergraphs

# 顺时针旋转 90°:使用转置过滤器 ffplay -f lavfi -i testsrc -vf transpose=1 # 使用atempo音频过滤器将输入音频的速度降低到80%: ffmpeg -i input.mp3 -af atempo=0.8 output.mp3

_________ ______________ | | | | | decoded | | encoded data | | frames |\ _ | packets | |_________| \ /||______________| \ __________ / simple _\|| | / encoder filtergraph | filtered |/ | frames | |__________| _________ | | | input 0 |\ __________ |_________| \ | | \ _________ /| output 0 | \ | | / |__________| _________ \| complex | / | | | |/ | input 1 |---->| filter |\ |_________| | | \ __________ /| graph | \ | | / | | \| output 1 | _________ / |_________| |__________| | | / | input 2 |/ |_________|

# -vf <=> -filter:v ffmpeg -i input.mpg -vf hqdn3d,pad=2*iw output.mp4 ffmpeg -i output.mp4 -i input.mpg -filter_complex overlay=w compare.mp4

使用带有链接标签的filtergraph,就只有一个命令:

# 分割过滤器将输入分为2个输出标签[a]和[b],然后将[a]链接用作第二个filterchain的输入,它为标记[a]的比较创建了一个pad。[b]链接被用作第三个filterchain的输入,它创建一个标记为[b]的输出。最后一个filterchain使用[A]和[B]标签作为覆盖过滤器的输入,从而产生最终的比较。 ffplay -i i.mpg -vf 'split[a][b];[a]pad=2*iw[A];[b]hqdn3d[B];[A][B]overlay=w'

下图是另一个例子: ffplay -f lavfi -i rgbtestsrc -vf "split[a][b];[a]pad=2*iw[1];[b]vflip[2];[1][2]overlay=w"

选择媒体流

流的形式说明符

# 下面这个命令中 out1.mkv out2.wav 将包含 A.avi, B.mp4 中最佳的 video/audio 和第一个 subtitle # 而 out3.mov 只会有 B.mp4 中的 audio, 而且不会处理,只是 copy ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov # 下面的命令中 out1.mkv 只会有 audio/video 因为默认的字幕 encoder 是 Matroska muxer 是 text-based,但是 C.mkv 里面的的字幕是 image-based # 所以字幕不会被选择;而 out2.mkv 只有 video/subtitle 因为 audio 被 -an 操作排除了 ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv # 下面这个命令中 overlay 需要两个输入,但是没有指定,所以自动选择 A.avi 和 C.mkv 中的 video 生成 out1.mp4, 同时 out1.mp4 会有 A,C 中最佳 # audio, 但是不会有字幕,因为 mp4 没有默认字幕 encoder,又没主动设置。out2.srt 将选择 A,C 中第一个 text-based 字幕流 ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt # 下面的命令使用 labeled filtergraph, 这里要注意, 对于 label outv1, outv2 都要**有且仅有一次的使用**,如果没有 label 默认输出到第一个输出 # outv1, overlay, aresample 都会输出到 out1.mp4, -an 不会抑制 filtergraphs 的输出;out2.mkv 由 automatic stream selection 决定输出 # out3.mkv 输入内容为 hue filter 的一份输出 B.mp4 的第一个 audio ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0,split=2[outv1][outv2];overlay;aresample" \ -map '[outv1]' -an out1.mp4 \ out2.mkv \ -map '[outv2]' -map 1:a:0 out3.mkvLavfi虚拟设备

Lavfi通常用于显示测试模式,例如带有命令的SMPTE条:

ffplay -f lavfi -i smptebars

ffplay -f lavfi -i color=c=blue颜色名称

显示帮助和功能

例如,要显示关于FLV解码器的信息,我们可以使用以下命令:

ffmpeg -h decoder=flv

比特率/帧率/文件大小帧率(频率)的介绍

帧率设置

# 改变视频的帧率。avi文件从25到30 fps ffmpeg -i input.avi -r 30 output.mp4 # 要更改剪辑的输入帧速率。mpg文件到值25 ffmpeg -i clip.mpg -vf fps=fps=25 clip.webm # 设置帧速率为29.97 fps ffmpeg -i input.avi -r ntsc output.mpg比特率

比特率是决定整体音频或视频质量的参数。 它规定了每时间单位处理的位数,在FFmpeg中,比特率以每秒位数表示。

调整和伸缩视频调整视频

# 下面两个命令等价 ffmpeg -i input.avi -s 640x480 output.avi ffmpeg -i input.avi -s vga output.avi#例如,800x600(SVGA)分辨率的视频包含2像素宽的细节。 当缩放到640x480(VGA)分辨率时,缩放比率为0.8,并且2像素再缩放为2像素: 640 pixels / 800 pixels = 0.8 2 pixels * 0.8 = 1.6 ≈ 2 pixels # 但是当这个视频被缩放到160x120 (QQVGA)分辨率时,细节就丢失了: 160 pixels / 800 pixels = 0.2 2 pixels * 0.2 = 0.4 ≈ 0 pixels扩大滤波器

# 将128x96视频话放大到分辨率256x192像素 ffmpeg -i phone_video.3gp -vf super2xsai output.mp4高级缩放技能

# 按比例缩放视频输入 ffmpeg -i input.mpg -vf scale=iw/2:ih/2 output.mp4 # 扩展到预定义的宽度或高度: 等比缩放 ffmpeg -i input.avi -vf scale=400:400/a裁剪视频

填充视频

例子

ffplay -f lavfi -i testsrc -vf pad=380:360:30:30:pink -t 50 # 从4:3到16:9的填充视频 ffmpeg -i input -vf pad=ih*16/9:ih:(ow-iw)/2:0:color output # 从16:9到4:3的填充视频 ffmpeg -i input -vf pad=iw:iw*3/4:0:(oh-ih)/2:color output翻转和旋转视频

例子

ffplay -f lavfi -i testsrc -vf hflip # 一个看 help 的例子 > ffmpeg -h filter=transpose Filter transpose Transpose input video. slice threading supported Inputs: #0: default (video) Outputs: #0: default (video) transpose AVOptions: dir <int> ..FV....... set transpose direction (from 0 to 7) (default cclock_flip) cclock_flip 0 ..FV....... rotate counter-clockwise with vertical flip clock 1 ..FV....... rotate clockwise cclock 2 ..FV....... rotate counter-clockwise clock_flip 3 ..FV....... rotate clockwise with vertical flip passthrough <int> ..FV....... do not apply transposition if the input matches the specified geometry (from 0 to INT_MAX) (default none) none 0 ..FV....... always apply transposition portrait 2 ..FV....... preserve portrait geometry landscape 1 ..FV....... preserve landscape geometry模糊,锐化和去噪

overlay

# overlay 里面重要等变量为: # main_w or W 主要输入宽度; main_h or H 主要输入高度 # overlay_w or w overlay输入宽度; overlay_h or h overlay输入高度 # 下面这个命令会把 overlay 放在右上角 ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w pair2.mp4

为视频添加文字

ffplay -f lavfi -i color=white -vf drawtext=fontfile=/Library/Fonts/Baskerville.ttc:text=Welcome # 横向运动的文字 ffmpeg -f lavfi -i color=orange -vf drawtext="text=hello:x=w-t*50:y=h-th:fontcolor=blue:fontsize=30" -t 50 test.mp4编码解码

# 语法如下,用在 input 前面就是 decoder, 用在 output 前面就是 encoder -c[:stream_specifier] codec (input/output,per-stream) -codec[:stream_specifier] codec (input/output,per-stream) # 一个 stream 前面可能应用了很多 codec, 以 last matching c option 为准 # 比如下面这个命令会 用 libx264 encode 第一个 video, libvorbis encode 第 137 个 audio, 其他 stream copy ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT

时间操作

ffmpeg -i music.mp3 -t 180 music_3_minutes.mp3 ffmpeg -i video.avi -vframes 15000 video_10_minnutes.avi ffmpeg -i input.avi -ss 10 output.mp4 # 从 video.mpg 中保存第5分钟的部分 ffmpeg -i video.mpg -ss 240 -t 60 clip_5th_minute.mpg # 音频比视频要快了 1.5 秒 做同步, 这里 -c 表示 -codec[:stream_specifier] codec <=> -c[:stream_specifier] codec (input/output,per-stream) ffmpeg -i input.mpv -map 0:v -map 0:a -itsoffset 1.5 -c:a copy -c:v copy output.mov # 视频快了 5 秒 做同步 ffmpeg -i input.mov -map 0:v -itsoffset 5 -map 0:a -c:a copy -c:v copy output.mov # 两个文件,将音频流延迟 3 秒 ffmpeg -i v.mpg -itsoffset 3 -i a.mp3 -map 0:v:0 -map 1:a:0 output.mp4 # 3 倍速来观看视频 ffplay -f lavfi -i testsrc -vf setpts=PTS/3 # 2 倍速来播放输入音频 ffplay -i speech.mp3 -af atempo=2 # 使用时间戳来同步 music.mpg 文件中的数据 ffmpeg -i music.mpg -af asyncts=compensate=1 -f mpegts music.ts数学函数

# 产生频率为523.251 Hz的C5音调(中音高C)的音调 ffplay -f lavfi -i aevalsrc='sin(523.251*2*PI*t)'元数据和字幕

# 查看一个 mp3 文件的元数据 > ffprobe '~/Downloads/Jack Johnson - Imagine.mp3' ... 省略部分内容 Input #0, mp3, from '~/Downloads/Jack Johnson - Imagine.mp3': Metadata: encoder : Lavf56.4.101 disc : 1 track : 11 artist : Jack Johnson comment : 163 key(Don't modify):L64FU3W4YxX3ZFTmbZ 8/UnVjCnqpKdEibASol9of8KaPX//btdBYF VVRkXkEDD/iGR355GeUXxh0IUGR/GwBNi9G4ezN6Z7cPYKcJ3G01aqRPkU1umKYjjZLXvNFMCMLrmf5mGqVQo hTaZlpidWU9kf8oTXfXHN4cj2PKPLh7HFCdJ/oKzLj3tB/BKqQJjZ1moy59PXmgevX6IGXydNfGHhxwts 3ZlZ/1FBko title : Imagine album : The Mango Tree # 新建元数据 ffmpeg -i '~/Downloads/Jack Johnson - Imagine.mp3' -metadata "k1=v1" -metadata "k2=v2" -y ~/Downloads/test.mp3 # 保存元数据到文件 ffmpeg -i ~/Downloads/test.mp3 -f ffmetadata ~/Downloads/test.txt # 加载文件元数据到文件 ffmpeg -i ~/Downloads/test.txt -i ~/Downloads/test.mp3 ~/Downloads/test2.mp3 # 删除元数据 ffmpeg -i input.avi -map_metadata -1 output.mp4

下图不一定准确,可以参考一下常见的 predefined metadata 有哪些 key

图像处理

虽然FFmpeg工具的主要用途与音频和视频有关,但ffmpeg可以对各种图像格式进行解码和编码,并且许多图像相关任务可以快速完成

# 截图 ffmpeg -i in1.mp4 -ss 3 -frames:v 1 snap.jpg # gif ffmpeg -i in1.mp4 -pix_fmt rgb24 in1.gif # 从内置视频源生成图片,比如生成一个单色的图片 ffmpeg -f lavfi -i color=c=#008080:s=728x90 -frames:v 1 leaderboard.jpg

数字音频

数字音频是一种技术,用于捕获、记录、编辑、编码和复制声音,这些声音通常由脉冲编码调制(PCM)进行编码。FFmpeg支持许多音频格式,包括AAC、MP3、Vorbis、WAV、WMA等

音频基础音频操作

# 产生音符A4,音高的调优标准,将tone_height设置为440 Hz: ffplay -f lavfi -i aevalsrc='sin(440*2*PI*t)' -t 2 # 多声道【立体声】 ffplay -f lavfi -i aevalsrc='sin(495*2*PI*t)|cos(505*2*PI*t):c=FL FR' # 音频分析 ffmpeg -report -i ~/Downloads/test.mp3 -af ashowinfo -f null /dev/null预设编解码器

vcodec=flv # 视频编解码器, 必填唯一 b:v=300k # 视频比特率 g=160 # 图片组大小 mbd=2 # macroblock决策算法 flags= aic mv0 mv4 # aic - h263高级内部编码;总是尝试使用mv=<0,0>;mv4 -使用macroblock的4运动矢量 trellis=1 # rate失真优化量化 ac=1 # 声道数 ar=22050 # 音频采样率 b:a=56k # 音频比特率隔行视频隔行视频标准

隔行视频操作

略,参考 https://www.jianshu.com/p/fb051e1457c2

麦克风和摄像头

略, https://www.jianshu.com/p/95012f6696e0

颜色修正

略,https://www.jianshu.com/p/f2a94de1c26a

高级常用参数和例子

-f fmt (input/output) :指定输入或者输出文件格式。常规可省略而使用依据扩展名的自动指定 -c:指定编码器 -c copy:直接复制,不经过重新编码(这样比较快) -c:v:指定视频编码器 -c:a:指定音频编码器 -i:指定输入文件 -an:去除音频流 -vn: 去除视频流 -preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。 -y:不经过确认,输出时直接覆盖同名文件。 -c[:stream_specifier] codec (input/output,per-stream) -codec[:stream_specifier] codec (input/output,per-stream) 为特定的文件选择编/解码模式,对于输出文件就是编码器,对于输入或者某个流就是解码器。选项参数(后面的那个)中codec是编解码器的名字,或者是copy(仅对输出文件)则意味着流数据直接复制而不再编码 // 在输出文件中第2视频流按libx264编码,第138音频流按libvorbis编码,其余都直接复制输出 ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT -t duration (input/output):限制输入/输出的时间。如果是在-i前面,就是限定从输入中读取多少时间的数据;如果是用于限定输出文件,则表示写入多少时间数据后就停止 -ss position (input/output): 当在-i前时,表示定位输入文件到position指定的位置。注意可能一些格式是不支持精确定位的,所以ffmpeg可能是定位到最接近position(在之前)的可定位点。当用于输出文件时,会解码丢弃position对应时间码前的输入文件数据 -dn (input/output) As an input option, blocks all data streams of a file from being filtered or being automatically selected or mapped for any output. See -discard option to disable streams individually. As an output option, disables data recording i.e. automatic selection or mapping of any data stream. For full manual control see the -map option. -dframes number (output):设定指定number数据帧到输出文件,这是-frames:d的别名。 frames[:stream_specifier] framecount (output,per-stream):在指定计数帧后停止写入数据。 -q[:stream_specifier] q (output,per-stream) -qscale[:stream_specifier] q (output,per-stream) 使用固定的质量品质(VBR)。用于指定q|qscale编码依赖。如果qscale没有跟stream_specifier则只适用于视频。其中值q取值在0.01-255,越小质量越好 -filter[:stream_specifier] filtergraph (output,per-stream):创建一个由filtergraph指定的滤镜,并应用于指定流。 // 视频(video)选项 -vframes number (output):设置输出文件的帧数,是-frames:v的别名 -r[:stream_specifier] fps (input/output,per-stream):设置帧率(一种Hz值,缩写或者分数值) -s[:stream_specifier] size (input/output,per-stream):设置帧的尺寸。 -aspect[:stream_specifier] aspect (output,per-stream):指定视频的纵横比(长宽显示比例) -vn (output):禁止输出视频 -vcodec codec (output):设置视频编码器,这是-codec:v的一个别名 // OPTIONS FOR SETTING QUALITY -b:v or -b:a to set bitrate // e.g., -b:v 1000K = 1000 kbit/s, -b:v 8M = 8 Mbit/s -q:v or -q:a to set fixed-quality parameter //e.g., -q:a 2 for native AAC encoder // Examples of encoder-specific options: -crf to set Constant Rate Factor for libx264/libx265 -vbr to set constant quality for FDK-AAC encoder // Different kinds of rate control CBR/VBR/CQP..... //Rate depends on content characteristics // 音频选项 -aframes number (output):设置number音频帧输出,是-frames:a的别名 -ar[:stream_specifier] freq (input/output,per-stream):设置音频采样率。默认是输出同于输入。对于输入进行设置,仅仅通道是真实的设备或者raw数据分离出并映射的通道才有效。对于输出则可以强制设置音频量化的采用率。 -aq q (output):设置音频品质(编码指定为VBR),它是-q:a的别名。 -ac[:stream_specifier] channels (input/output,per-stream):设置音频通道数。默认输出会有输入相同的音频通道。对于输入进行设置,仅仅通道是真实的设备或者raw数据分离出并映射的通道才有效。 -an (output):禁止输出音频 -acode codec (input/output):设置音频解码/编码的编/解码器,是-codec:a的别名 // 字幕选项 -scodec codec (input/output):设置字幕解码器,是-codec:s的别名。例子

// Transcoding from one codec to another (e.g. H.264 using libx264): ffmpeg -i <input> -c:v libx264 output.mp4 // Transmuxing from one container/format to another – without re-encoding: ffmpeg -i input.mp4 -c copy output.mkv // Cut a video from timestamp <start> for <duration>, or until <end>: ffmpeg -ss 00:01:50 -i <input> -t 10.5 -c copy <output> ffmpeg -ss 2.5 -i <input> -to 10 -c copy <output> // 使用 SPEED/QUALITY PRESETS IN X264 预置 preset ffmpeg -i <input> -c:v libx264 -crf 23 -preset ultrafast -an output.mkv ffmpeg -i <input> -c:v libx264 -crf 23 -preset medium -an output.mkv ffmpeg -i <input> -c:v libx264 -crf 23 -preset veryslow -an output.mkv // map input streams to output, e.g. to add audio to a video: ffmpeg -i input.mp4 -i input.m4a -c copy -map 0:v:0 -map 1:a:0 output.mp4 // scale - Scale to 320×240: ffmpeg -i <input> -vf "scale=w=320:h=240" <output> // padding ffmpeg -i <input> -vf "pad=1920:1080:(ow-iw)/2:(oh-ih)/2" <output> // Simple fade-in and fade-out at a specific time for a specific duration. ffmpeg -i <input> -filter:v "fade=t=in:st=0:d=5,fade=t=out:st=30:d=5" <output> // Complex system for printing text on video ffmpeg -i <input> -vf \ drawtext="text='Test Text':x=100:y=50:\ fontsize=24:fontcolor=yellow:box=1:boxcolor=red" \ <output> // Decode three video/audio streams and append to one another: ffmpeg -i <input1> -i <input2> -i <input3> -filter_complex \ "[0:0][0:1][1:0][1:1][2:0][2:1]concat=n=3:v=1:a=1[outv][outa]" \ -map "[outv]" -map "[outa]" <output> // Show a watermark in the top left corner between seconds 1 and 2 only ffmpeg -i <video> -i <watermark> -filter_complex \ "[0:v][1:v]overlay=10:10:enable='between(t,1,2)'[outv]" \ -map "[outv]" <output>

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved