文章目录
- 一、 FFmpeg 音视频的处理流程
- 二、FFmpeg 常用命令
- 2.1、查看本机支持的采集设备
- 2.2、 录制视频
- 2.2.1、原始视频
- 2.2.2、编码的视频
- 2.3、录制音频:
- 2.3.1、原始音频
- 2.3.2、编码的音频
- 2.4、录制音视频:
- 2.5、文件格式转换:
- 2.6、提取音频 :
- 2.7、提取视频:
- 2.8、合并音视频:
- 2.9、视频裁剪
- 时长
- 分辨率
- 2.10、 倍速
- 视频倍速
- 音频倍速
- 音视频倍速
- 2.11、[视频转图片](https://www.ffmpeg.org/ffmpeg-formats.html#image2_002c-image2pipe):
- 2.12、[图片转视频](https://www.ffmpeg.org/ffmpeg-formats.html#image2-1):
- 2.13、推流:
- 文件推流:
- 摄像头推流:
- 桌面屏幕推流:
- 2.14、拉流:
- 三、FFprobe 常用命令
- 查看格式
- 查看帧信息
- 查看packet信息
以下命令和参数都可以在 官方文档,找到解释
一、 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_devicestrue-i""查看编解码器的信息,例如:支持的像素格式
ffmpeg-h encoder=h264_videotoolbox2.2、 录制视频
2.2.1、原始视频
ffmpeg-f avfoundation-i"1"-video_size1280x720-r30out.yuv-i “1” 表示video的选择是 从AVFoundation支持的video设备中,索引1 的video设备,具体是指桌面
-video_size 1280x720 是无效的,从设备输入,不支持改变分辨率
-r 30 此例子中是 指定输出的帧率为30fps
播放yuv 原始视频时,需要指定分辨率和像素格式,这些信息,在录制时会输出
ffplay-pixel_format uyvy422-video_size5120x2880 out.yuv2.2.2、编码的视频
ffmpeg-f avfoundation-i"1"out.mp42.3、录制音频:
2.3.1、原始音频
ffmpeg-f avfoundation-i:0-ar44100-f s16le out.pcm-i :0 表示audio的选择是 AVFoundation支持的audio设备中,索引0的设备,具体是指桌面
-ar 44100 此处指设置输出文件的采样率
-f s16le 指定原始音频的采样格式
播放原始音频,需要指定采样格式:
ffplay-f s16le out.pcm2.3.2、编码的音频
ffmpeg-f avfoundation-i:0out.wav2.4、录制音视频:
ffmpeg-f avfoundation-i1:0out.mp4
红框中,视频解码器 rawvideo,编码器mpeg4,使用命令ffmpeg -encoders可以找到该编码器
对音频、视频指定编码器
ffmpeg-f avfoundation-i1:0-c:v h264-c:a aac-ac2-s3840x2160 out.mp42.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.mp42.9、视频裁剪
时长
从1s开始,裁剪5s
ffmpeg-ss00:00:01.000-t5-i input1.mp4 output1.mp4裁剪最后5s,不能和-ss同时用
ffmpeg-sseof-5-i input1.mp4 output1-2.mp4分辨率
改变视频分辨率为宽320、高240
ffmpeg-i input.mp4-s320x240 output.mp4改变视频分辨率为宽480、高度为等比缩放,像素数可被1整除
ffmpeg-i input.mp4-filter:v"scale=480:-1,fps=10"output.mp4scale=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.mp42.11、视频转图片:
从input.mp4 提取一系列图片
ffmpeg-i input.mp4-r30-f image2 foo-%03d.jpeg-r 30 fps 是30,表示一秒生成30张图片
foo-%03d.jpeg 文件名格式, 会生成 foo-001.jpeg、foo-002.jpeg … 等
2.12、图片转视频:
用一系列图片 生成一个mp4文件
ffmpeg-r30-i foo-%05d.jpeg output.mp42.13、推流:
文件推流:
ffmpeg-loglevel debug-re-stream_loop-1-i input3.mp4-c:v h264-c:a aac-ac2-g30-b:v1500k-b:a128k-f flv'rtmp://xxxxx'-re 通过限制输入的读取速度,确保推流时以与文件帧率一致的速度读取。强制 FFmpeg 模拟文件“实时播放”的行为。
如果不加 -re,FFmpeg 会以最快速度读取输入文件。这样推流的速度会远超正常播放速度,导致:
• 流媒体服务器缓冲过载。
• 推流失败,甚至崩溃。
-stream_loop -1 循环播放
-b:v 视频码率
-b:a 音频码率
问题:
推流失败, 检查流的编码格式是否符合rtmp服务器的接收格式, 通过-c:v 指定视频编码器
推流成功,可以看到画面,但是没有声音。 通过 -c:a 指定音频编码器
摄像头推流:
ffmpeg-f avfoundation-r30-i0:0-c:v h264-c:a aac-ac2-g30-b:v1500k-b:a128k-f flv 'rtmp://xxxxxxx'如果在输入参数中没有 -r 30, 会报如下错误。高手指点一下,为什么会出现framerate (29.970030),
桌面屏幕推流:
ffmpeg-f avfoundation-r30-i1:0-c:v h264-c:a aac-ac2-g30-b:v1500k-b:a128k-s3840x2160-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-n50查看input1.mp4的视频的帧信息的前50行,
你可能注意到了,在含有b帧的视频中,pts 和pkg.dts 竟然也是一样的,关于这个讨论已经存在挺久,但我还是没有完全理解,为什么要那样做? 高手们可以指导一下。
dts是解码的时间戳,应该是作用于packet,你想到去查看packet信息,命令如下
查看packet信息
ffmpeg-i2.mp4-dump-map0:v-f null-这回dts 和pts 是正确了,但你既要查看帧信息的pts,还要看packet的dts、pts,还有帧类型。好吧,谁叫你是我粉丝,代码写好了,在这里,直接copy算抄袭,点赞后算借鉴。😄