编程技术分享平台

网站首页 > 技术教程 正文

FFmpeg---cmd命令操作汇总(ffmpeg常用命令)

xnh888 2024-11-06 12:55:10 技术教程 67 ℃ 0 评论

### 学习笔记

FFMPEG是特别强大的专门用于处理音视频的开源库。你既可以使用它的API对音视频进行处理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,来编辑你的音视频文件。下面主要记录如何使用它提供的工具,在Windows10系统中应用,目前采用的版本4.1。

FFMPEG 目录及作用

libavcodec: 提供了一系列编码器的实现。

libavformat: 实现在流协议,容器格式及基本IO访问。

libavutil: 包括了hash器,解码器和各类工具函数。

libavfilter: 提供了各种音视频过滤器。

libavdevice: 提供了访问捕获设备和回放设备的接口。

libswresample: 实现了混音和重采样。

libswscale: 实现了色彩转换和缩放工能。

主要处理流程:

输入音视频文件(mp4/ ts / mov等)封装好的文件,解封装(demuxer)成为一个数据包,即把视频文件和音频文件从盒子里拿出来,再按照需要分别解码(decoder),成为一帧帧的数据(frames),对数据进行需要的处理,然后编码(encoder)成为数据包,即音频文件和视频文件,再封装(muxer),即把音频文件和视频文件放进一个盒子里,输出音视频文件。

如果只是把mp4 转成 ts 格式,则不需要进行decoder和encoder,直接对数据包进行操作。

基本查询命令

相关学习资料推荐,点击下方链接免费报名,先码住不迷路~】

音视频免费学习地址:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发

【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击788280672加群免费领取~

命令基本格式及参数

主要参数

视频参数

音频参数

录制视频、音频

// 列出设备,查看有哪些音频采集设备(麦克风等),视频采集设备(摄像头等)

ffmpeg -list_devices true -f dshow -i dummy

1. 录屏

// 这里安装了screen_capture;编码器采用H264; -r 30, 帧率为30;输出mp4. 录制的视频中鼠标有点错位???

ffmpeg -f dshow -i video="screen-capture-recorder" -vcodec h264 -r 30 screen.mp4

ffmpeg -f dshow -i video="screen-capture-recorder" -r 30 out.yuv // 录制yuv文件,未压缩,特别大,慎用。

// 下面的命令待测试。

ffmpeg -y -f dshow -i video="screen-capture-recorder" -f dshow -i audio="麦克风 (Realtek High Definition Audio)" -vcodec libx264 -acodec libmp3lame -video_size 320x240 -offset_x 100 -offset_y 60 -r 15 -f mp4 d:/temp.mp4

2. 录制摄像头

ffmpeg -f dshow -i video="Integrated Camera" -vcodec h264 -r 30 camera.mp4

3. 录制声音

ffmpeg -f dshow -i audio="virtual-audio-capturer" a-out.wav // vitual-audio-capturer采集不到声音

ffmpeg -f dshow -i audio="麦克风阵列 (Conexant SmartAudio HD)" a-out.wav // 可以采集到声音

//-profile 是 fdk_aac 的参数。 aac_he_v2 表式使用 AAC_HE v2 压缩数据。

// -b:a 指定音频码率。 b 是 bitrate的缩写, a是 audio的缩写。

ffmpeg -f dshow -i audio="麦克风阵列 (Conexant SmartAudio HD)" -profile:a aac_he_v2 -b:a 32k aout.mp3

// 录制音频未编码数据

ffmpeg -f dshow -i audio="麦克风阵列 (Conexant SmartAudio HD)" -ar 44100 -f s16le out.pcm

4、摄像头+录音

// video与audio中间用冒号隔开,只对video指定了编码、帧率,audio会根据输出文件的格式,设置编码格式参数等。

//(仅用VLC播放)比较好的一点是,音视频比较同步

ffmpeg -f dshow -i video="Integrated Camera":audio="麦克风阵列 (Conexant SmartAudio HD)" -vcodec libx264 -r 30 av-out.mp4

5、录屏+录音

ffmpeg -f dshow -i video="screen-capture-recorder":audio="麦克风阵列 (Conexant SmartAudio HD)" -vcodec libx264 -r 30 av-out.mp4 // 录制的视频中鼠标有点错位,相差1cm左右???比较好的一点是,音视频比较同步

简单说明:

-f 指定使用 dshow 采集数据

-i 指定从哪儿采集数据

-r 指定帧率。按ffmpeg官方文档说-r与-framerate作用相同,但实际测试时发现不同。-framerate 用于限制输入,而-r用于限制输出。-framerate优选。

分解与复用

1. 抽取音频流

// 从ts中,抽取出音频文件

ffmpeg -i Titanic.ts -acodec copy -vn out.mp3

acodec: 指定音频编码器,copy 指明只拷贝,不做编解码。

vn: v 代表视频,n 代表 no 也就是无视频的意思。

2. 抽取视频流

// 从ts中,抽取出视频文件

ffmpeg -i Titanic.ts -vcodec copy -an out.h264

vcodec: 指定视频编码器,copy 指明只拷贝,不做编解码。

an: a 代表视频,n 代表 no 也就是无音频的意思。

3. 音视频合并

ffmpeg -i out.h264 -i out.mp3 -vcodec copy -acodec copy new.mp4

4. 转格式

ffmpeg -i Titanic.ts -vcodec copy -acodec copy Titanic.mp4

5. 提取YUV数据

ffmpeg -i Titanic.mp4 -an -c:v rawvideo -pixel_format yuv420 out.yuv

-c:v rawvideo 指定将视频使用原始数据进行编码,所以需要指定编码格式↓

-pixel_format yuv420 指定转换格式为yuv420

//播放yuv数据,需要指定大小, 需要指定像素格式。如果默认是yuv420,就不用指定了。否则需要指定。。

ffplay -s 640x480 -pix_fmt uyvy422 out.yuv

6. YUV转H264

ffmpeg -f rawvideo -pix_fmt yuv420p -s 640x272 -r 30 -i out.yuv -c:v libx264 -f rawvideo out.h264

7. 提取PCM数据

ffmpeg -i Titanic.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm

-ar :音频采样率,44100

-ac: 音频通道数,1,2,3.。。

-f : 音频数据存储格式,s16le ,有符号16位小头。

播放:ffplay -ar 44100 -ac 2 -f s16le out.pcm ,// 需要指定参数,否则无法播放。

8. PCM转WAV

ffmpeg -f s16be -ar 8000 -ac 2 -acodec pcm_s16be -i out.pcm output.wav

-f : 强制输入格式为 s16be

专业人才、二次开发,必须掌握命令。例如:提取yuv数据,对yuv做每一帧的数据的放大缩小等。

滤镜

在编码之前,ffmpeg可以使用libavfilter库中的过滤器处理原始音频和视频帧。 几个链式过滤器形成一个过滤器图形。 ffmpeg区分两种类型的过滤器图形:简单和复杂。

简单滤镜

简单的过滤器图是那些只有一个输入和输出,都是相同的类型。通过在解码和编码之间插入一个额外的步骤来表示:

对packets 解码decoded,得到frames, 对frame进行过滤filtered, 然后再encoder, 得到encoded data packets.

简单的filtergraphs配置了per-stream-filter选项(分别为视频和音频使用-vf和-af别名)。 一个简单的视频filtergraph可以看起来像这样的例子:

请注意,某些滤镜会更改帧属性,但不会改变帧内容。 例如。 上例中的fps过滤器会改变帧数,但不会触及帧内容。 另一个例子是setpts过滤器,它只设置时间戳,否则不改变帧。

复杂滤镜

复杂的过滤器图是那些不能简单描述为应用于一个流的线性处理链的过滤器图。 例如,当图形有多个输入和/或输出,或者当输出流类型与输入不同时,就是这种情况。 他们可以用下图来表示:

复杂的过滤器图使用-filter_complex选项进行配置。 请注意,此选项是全局性的,因为复杂的过滤器图形本质上不能与单个流或文件明确关联。

-lavfi选项等同于-filter_complex。

一个复杂的过滤器图的一个简单的例子是覆盖过滤器,它有两个视频输入和一个视频输出,包含一个视频叠加在另一个上面。 它的音频对应是amix滤波器。

添加水印

ffmpeg -i out.mp4 -vf "movie=logo.png,scale=64:48[watermask];[in][watermask] overlay=30:10 [out]" water.mp4

-vf中的 movie 指定logo位置。scale 指定 logo 大小。overlay 指定 logo 摆放的位置。

删除水印

先通过 ffplay 找到要删除 LOGO 的位置

ffplay -i test.flv -vf delogo=x=806:y=20:w=70:h=80:show=1

使用 delogo 滤镜删除 LOGO

ffmpeg -i test.flv -vf delogo=x=806:y=20:w=70:h=80 output.flv //指定想x,y起点,指定宽高。

视频缩小一倍(不是剪裁)

ffmpeg -i out.mp4 -vf scale=iw/2:-1 scale.mp4

-vf scale 指定使用简单过滤器 scale,iw/2:-1 中的 iw 指定按整型取视频的宽度。 -1 表示高度随宽度一起变化。

视频剪裁

ffmpeg -i VR.mov -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy -video_size 1280x720 vr_new.mp4

crop 格式:crop=out_w:out_h:x:y

out_w: 输出的宽度。可以使用 in_w 表式输入视频的宽度。

out_h: 输出的高度。可以使用 in_h 表式输入视频的高度。

x : X坐标

y : Y坐标

如果 x和y 设置为 0,说明从左上角开始裁剪。如果不写是从中心点裁剪。

-vf : 视频滤镜,crop(滤镜名字)

in_w:本身视频宽,in_h:本身视频高

倍速播放

ffmpeg -i out.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" speed2.0.mp4

-filter_complex 复杂滤镜,[0:v]表示第一个(文件索引号是0)文件的视频作为输入。setpts=0.5*PTS表示每帧视频的pts时间戳都乘0.5 ,也就是差少一半。[v]表示输出的别名。音频同理就不详述了。

map 可用于处理复杂输出,如可以将指定的多路流输出到一个输出文件,也可以指定输出到多个文件。"[v]" 复杂滤镜输出的别名作为输出文件的一路流。上面 map的用法是将复杂滤镜输出的视频和音频输出到指定文件中。

对称视频

ffmpeg -i out.mp4 -filter_complex "[0:v]pad=w=2*iw[a];[0:v]hflip[b];[a][b]overlay=x=w" duicheng.mp4

hflip 水平翻转。如果要修改为垂直翻转可以用vflip。

画中画

ffmpeg -i out.mp4 -i out1.mp4 -filter_complex "[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[ckout];[0:v][ckout]overlay=x=W-w-10:y=0[out]" -map "[out]" -movflags faststart new.mp4

录制画中画(avfoundation适用于Mac,Windows是dshow,具体需要探究)

ffmpeg -f avfoundation -i "1" -framerate 30 -f avfoundation -i "0:0"

-r 30 -c:v libx264 -preset ultrafast

-c:a libfdk_aac -profile:a aac_he_v2 -ar 44100 -ac 2

-filter_complex "[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[a];[0:v][a]overlay=x=W-w-10:y=0[out]"

-map "[out]" -movflags faststart -map 1:a b.mp4

多路视频拼接(avfoundation适用于Mac,Windows是dshow,具体需要探究)

ffmpeg -f avfoundation -i "1" -framerate 30 -f avfoundation -i "0:0" -r 30 -c:v libx264 -preset ultrafast -c:a libfdk_aac -profile:a aac_he_v2 -ar 44100 -ac 2 -filter_complex "[0:v]scale=320:240[a];[a]pad=640:240[b];[b][1:v]overlay=320:0[out]" -map "[out]" -movflags faststart -map 1:a c.mp4

音视频的拼接与裁剪

剪裁

ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out1.mp4

-ss 指定裁剪的开始时间,精确到秒。

-t 被裁剪后的时长。单位是秒。

合并

首先创建一个 inputs.txt 文件,文件内容如下:

__________

| file '1.ts' |

| file '2.ts' |

|_________|

然后执行下面的命令:

ffmpeg -f concat -i inputs.txt -c copy output.flv

-concat: 拼接(mp4不知道行不行,可能不行。)

hls切片

ffmpeg -i out.mp4 -c:v libx264 -c:a libfdk_aac -strict -2 -f hls out.m3u8

-strict -2 指明音频使有AAC。

-f hls 转成 m3u8 格式。

视频图片互转

视频转JPEG

ffmpeg -i test.flv -r 1 -f image2 image-%3d.jpeg

-r 1 : 每秒中1张图片

image-%3d: 生成的图片名称为image-001等,后面时3位有序数字

视频转gif

ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out.gif // 10s的动图

图片转视频

ffmpeg -f image2 -i image-%3d.jpeg images.mp4 // 如果这是刚才的截图做的视频,视频的播放会很快。比如快25倍。

直播相关

推流

ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/streamName

拉流保存

ffmpeg -i rtmp://server/live/streamName -c copy dump.flv

转流

ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v copy -f flv rtmp://server/live/h264Stream

实时推流(avfoundation 适用于MAC,不适用于WINDOWS)

ffmpeg -framerate 15 -f avfoundation -i "1" -s 1280x720 -c:v libx264 -f flv rtmp://localhost:1935/live/room

可以进行拉流的地址:404

ctrl+c: 停止。

ffplay

播放YUV 数据

ffplay -pix_fmt nv12 -s 192x144 1.yuv

播放YUV中的 Y平面

ffplay -pix_fmt nv21 -s 640x480 -vf extractplanes='y' 1.yuv

需要指明YUV的大小和帧率,才能播放源码。


原文链接:FFmpeg---cmd命令操作汇总_cmd ffmpeg_qq_34732729的博客-CSDN博客

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表