FFmpeg常用命令
文章目录
- 一、 FFmpeg 音视频的处理流程
- 二、FFmpeg 常用命令
- 三、FFprobe 常用命令
以下命令和参数都可以在 官方文档,找到解释
一、 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)!