FFmpeg之一——常用命令

FFmpeg之一——常用命令 文章目录一、 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 把编码后的opush264 封装为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的输出有一项是 AVFoundationAVFoundation 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 encoderh264_videotoolbox2.2、 录制视频2.2.1、原始视频ffmpeg-f avfoundation-i1-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-i1out.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 recording2.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开始裁剪5sffmpeg-ss00:00:01.000-t5-i input1.mp4 output1.mp4裁剪最后5s不能和-ss同时用ffmpeg-sseof-5-i input1.mp4 output1-2.mp4分辨率改变视频分辨率为宽320、高240ffmpeg-i input.mp4-s320x240 output.mp4改变视频分辨率为宽480、高度为等比缩放像素数可被1整除ffmpeg-i input.mp4-filter:vscale480:-1,fps10output.mp4scale480:-1 宽度为480px高度为等比缩放像素数可被1整除fps10 输出帧率是10 frame per second2.10、 倍速视频倍速过滤器setpts、asetpts使用过滤器setpts倍速播放视频ffmpeg-i input1.mp4-filter:vsetpts0.2*PTSoutput1-3.mp4视频倍速播放时长缩短播放完就黑屏。音频播放也不太正常中间有一段没有声音。可通过参数 -an 过滤掉音频。过滤器asetpts 不能改变音频的速度只能改变音频的pts缩短整体的播放时长ffmpeg-i input1.mp4-vn-filter:aasetpts0.2*PTSoutput1-3.mp4音频倍速使用过滤器atempo 倍速播放音频ffmpeg-i input1.mp4-filter:aatempo2output1.mp4音频会加速2倍播放时长缩短到一半 视频正常播放也就是说后半段视频没有音频音视频倍速根据map中的关于filtergraph的用法实现音视频倍速播放ffmpeg-i test.mp4-filter_complex[0:v]setpts0.5*PTS[v];[0:a]atempo2.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 flvrtmp://xxxxx-re 通过限制输入的读取速度确保推流时以与文件帧率一致的速度读取。强制 FFmpeg 模拟文件“实时播放”的行为。如果不加 -reFFmpeg 会以最快速度读取输入文件。这样推流的速度会远超正常播放速度导致• 流媒体服务器缓冲过载。• 推流失败甚至崩溃。-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算抄袭点赞后算借鉴。