自学内容网 自学内容网

FFmpeg常用命令


以下命令和参数都可以在 官方文档,找到解释

一、 FFmpeg 音视频的处理流程

在这里插入图片描述

  • demuxer :把输入文件INPUT.mkv 经过demuxer解封装,得到stream0 (经过encoder的音频数据,例如:aac) 和 stream1 (经过encoder的视频数据,例如:h264)

  • decoder:视频 H264 -> YUV、音频 opus/aac-> pcm(上图没有对音频进行decode)

  • encoder,视频 YUV -> H264,音频 pcm -> opus/aac(上图没有对音频进行encode)

  • muxer: 把编码后的opus,h264 封装为OUTPUT.mp4

  • 上图的audio没有经过解码和编码,通过streamcopy的方式,保存到了输出文件,这样速度更快。

  • 如果需要使用Filtergraphs (ffmpeg-filters),必须要经过 decoder,因为Filtergraphs是对原始数据进行处理。如下图:

在这里插入图片描述

二、FFmpeg 常用命令

可通过ffmpeg -h 查看 查询基本信息的参数

ffmpeg的命令格式

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

Each input or output can, in principle, contain any number of elementary streams of different types (video/audio/subtitle/attachment/data), though the allowed stream counts and/or types may be limited by the container format. Selecting which streams from which inputs will go into which output is either done automatically or with the -map option (see the Stream selection chapter).

To refer to inputs/outputs in options, you must use their indices (0-based). E.g. the first input is 0, the second is 1, etc. Similarly, streams within an input/output are referred to by their indices. E.g. 2:3 refers to the fourth stream in the third input or output. Also see the Stream specifiers chapter.

2.1、查看本机支持的采集设备

查看当前机器的输入输出设备:

ffmpeg -devices 

该命令在mac的输出,有一项是: AVFoundation
AVFoundation is the currently recommended framework by Apple for streamgrabbing on OSX >= 10.7 as well as on iOS.

Print the list of AVFoundation supported devices and exit:

ffmpeg -f avfoundation -list_devices true -i ""

查看编解码器的信息,例如:支持的像素格式

ffmpeg -h encoder=h264_videotoolbox

在这里插入图片描述

2.2、 录制视频

2.2.1、原始视频

ffmpeg -f avfoundation -i "1" -video_size 1280x720 -r 30 out.yuv

-i “1” 表示video的选择是 从AVFoundation支持的video设备中,索引1 的video设备,具体是指桌面
-video_size 1280x720 是无效的,从设备输入,不支持改变分辨率
-r 30 此例子中是 指定输出的帧率为30fps

播放yuv 原始视频时,需要指定分辨率和像素格式,这些信息,在录制时会输出

ffplay -pixel_format uyvy422 -video_size 5120x2880 out.yuv

2.2.2、编码的视频

 ffmpeg -f avfoundation  -i "1"  out.mp4

2.3、录制音频:

2.3.1、原始音频

ffmpeg -f avfoundation -i :0 -ar 44100 -f s16le out.pcm

-i :0 表示audio的选择是 AVFoundation支持的audio设备中,索引0的设备,具体是指桌面

-ar 44100 此处指设置输出文件的采样率

-f s16le 指定原始音频的采样格式

播放原始音频,需要指定采样格式:

ffplay -f s16le  out.pcm

2.3.2、编码的音频

ffmpeg -f avfoundation -i :0  out.wav

2.4、录制音视频:

ffmpeg -f avfoundation -i 1:0  out.mp4

在这里插入图片描述
红框中,视频解码器 rawvideo,编码器mpeg4,使用命令ffmpeg -encoders 可以找到该编码器

对音频、视频指定编码器

ffmpeg -f avfoundation -i 1:0 -c:v h264 -c:a aac  -ac 2 -s 3840x2160 out.mp4

2.5、文件格式转换:

ffmpeg -i input.mp4 -c:a copy -c:v copy output.flv

-i input.mp4 输入文件input.mp4
-c:a copy 把解封装后的已编码音频数据,拷贝到输出文件
-c:v copy 把解封装后的已编码视频数据,拷贝到输出文件
output.flv 输出文件output.flv

转GIF、flv、wav等格式, 只需要修改命令中的输出名后缀,例如:output1.mp4 改为 output.gif 。wav 没有视频,只有音频,ffmpeg会自动识别后缀,并处理

2.6、提取音频 :

ffmpeg -i input.mp4 -c:a copy -vn  output.aac

-c:a copy 音频编码器,只拷贝。就是把 input.mp4 经过demuxer后,得到的编码的音频文件,直接拷贝,不用解码再编码。

-vn As an output option, disables video recording

2.7、提取视频:

ffmpeg -i input.mp4 -c:v copy -an  output.h264

提取YUV数据

ffmpeg -i input.mp4 -an  -pixel_format yuv420p out.yuv

-c:v rawvideo 指定视频编码器,rawvideo 可以通过ffmpeg -encoders 找到

2.8、合并音视频:

ffmpeg -i output.aac -i output.h264 -c:v copy -c:a copy  output.mp4

2.9、视频裁剪

时长

从1s开始,裁剪5s

ffmpeg -ss 00:00:01.000  -t 5 -i input1.mp4  output1.mp4

裁剪最后5s,不能和-ss同时用

ffmpeg  -sseof -5 -i input1.mp4  output1-2.mp4

分辨率

改变视频分辨率为宽320、高240

ffmpeg -i input.mp4 -s 320x240 output.mp4

改变视频分辨率为宽480、高度为等比缩放,像素数可被1整除

ffmpeg -i input.mp4  -filter:v "scale=480:-1,fps=10" output.mp4

scale=480:-1 宽度为480px,高度为等比缩放,像素数可被1整除
fps=10 输出帧率是10 frame per second

2.10、 倍速

视频倍速

过滤器setpts、asetpts
使用过滤器setpts,倍速播放视频

ffmpeg -i input1.mp4  -filter:v "setpts=0.2*PTS" output1-3.mp4

视频倍速播放,时长缩短,播放完就黑屏。音频播放也不太正常,中间有一段没有声音。可通过参数 -an 过滤掉音频。

过滤器asetpts 不能改变音频的速度,只能改变音频的pts,缩短整体的播放时长

ffmpeg -i input1.mp4 -vn -filter:a "asetpts=0.2*PTS" output1-3.mp4

音频倍速

使用过滤器atempo 倍速播放音频

ffmpeg -i input1.mp4  -filter:a "atempo=2" output1.mp4 

音频会加速2倍播放,时长缩短到一半, 视频正常播放,也就是说后半段视频没有音频

音视频倍速

根据map中的关于filtergraph的用法,实现音视频倍速播放

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

2.11、视频转图片

从input.mp4 提取一系列图片

ffmpeg -i input.mp4 -r 30 -f image2 foo-%03d.jpeg

-r 30 fps 是30,表示一秒生成30张图片
foo-%03d.jpeg 文件名格式, 会生成 foo-001.jpeg、foo-002.jpeg … 等

2.12、图片转视频

用一系列图片 生成一个mp4文件

ffmpeg -r 30 -i foo-%05d.jpeg output.mp4

2.13、推流:

文件推流:

ffmpeg -loglevel debug -re -stream_loop -1 -i input3.mp4 -c:v h264  -c:a aac  -ac 2 -g 30 -b:v 1500k -b:a 128k -f flv 'rtmp://xxxxx'

-re 通过限制输入的读取速度,确保推流时以与文件帧率一致的速度读取。强制 FFmpeg 模拟文件“实时播放”的行为。
如果不加 -re,FFmpeg 会以最快速度读取输入文件。这样推流的速度会远超正常播放速度,导致:
• 流媒体服务器缓冲过载。
• 推流失败,甚至崩溃。
-stream_loop -1 循环播放

-b:v 视频码率
-b:a 音频码率

问题:
推流失败, 检查流的编码格式是否符合rtmp服务器的接收格式, 通过-c:v 指定视频编码器
推流成功,可以看到画面,但是没有声音。 通过 -c:a 指定音频编码器

摄像头推流:

ffmpeg  -f avfoundation -r 30 -i 0:0   -c:v h264  -c:a aac  -ac 2 -g 30 -b:v 1500k -b:a 128k -f flv 'rtmp://xxxxxxx'

如果在输入参数中没有 -r 30, 会报如下错误。高手指点一下,为什么会出现 framerate (29.970030)
在这里插入图片描述

桌面屏幕推流:

ffmpeg  -f avfoundation   -r 30  -i 1:0  -c:v h264   -c:a aac  -ac 2 -g 30  -b:v 1500k  -b:a 128k  -s 3840x2160  -f flv 'rtmp://xxxxxxx'

-s 3840x2160 设置输出的分辨率,如果不设置默认是5120x2880,会报错Error while opening encoder - maybe incorrect parameters such as bit_rate, rate, width or height.

在这里插入图片描述

2.14、拉流:

拉流播放:

ffplay rtmp://xxxxxx

拉流并保存文件

ffmpeg -i rtmp://xxxxxx  -c copy dump.flv

三、FFprobe 常用命令

查看格式

ffprobe -v error -show_format -show_streams input1.mp4

查看帧信息

ffprobe -show_frames -select_streams v input1.mp4 | head -n 50

查看input1.mp4的视频的帧信息的前50行


原文地址:https://blog.csdn.net/xx326664162/article/details/144894107

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!