【网络通信 -- 直播】FFMPEG 简介与常用命令总结

【网络通信 -- 直播】FFMPEG 简介与常用命令总结

【1】FFMPEG 简介

FFmpeg,项目的名称来自 MPEG 视频编码标准,"FF"代表"Fast Forward",一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序;采用 LGPL 或 GPL 许可证,提供录制、转换以及流化音视频的完整解决方案;

FFMPEG 音视频处理流程

【1.1】FFmpeg 的组成

FFMPEG 的整体结构

  • 第一部分 : 工具
    • ffmpeg.exe : 音视频转码、转换器,Hyper fast Audio and Video encoder,超快音视频编码器(类似爱剪辑);
    • ffplay.exe : 简单的音视频播放器,Simple media player,简单媒体播放器
    • ffserver.exe : 流媒体服务器
    • ffprobe.exe : 简单的多媒体码流分析器,Simple multimedia streams analyzer,简单多媒体流分析器
  • 第二部分 : SDK
    • libavcodec : 包含音视频编码器和解码器
    • libavutil : 包含多媒体应用常用的简化编程的工具,如随机数生成器、数据结构、数学函数等功能
    • libavformat : 包含多种多媒体容器格式的封装、解封装工具
    • libavfilter : 包含多媒体处理常用的滤镜功能
    • libavdevice : 用于音视频数据采集和渲染等功能的设备相关
    • libswscale : 用于图像缩放和色彩空间和像素格式转换功能
    • libswresample : 用于音频重采样和格式转换等功能
  • 第三部分 : 源码
    • FFmpeg 的源代码由 C 语言实现,主要在 Linux 平台上进行开发;

【1.2】FFmpeg 主要功能

视频采集功能,视频格式转换功能,视频截图功能,给视频加水印功能;

【1.3】FFmpeg 库

  • 1. libavutil,核心工具库,最基础模块之一,其他模块都会依赖该库做一些基本的音视频处理操作
  • 2. libavformat,文件格式和协议库,封装了 Protocol 层和 Demuxer、Muxer 层,使得协议和格式对开发者透明
  • 3. libavcodec,编解码库,封装了 Codec 层,但是有一些 codec 是具备自己的 License 的,FFmpe 不会默认添加 libx264、FDK-AAC、Lame 等库,但 FFmpeg 可以将其他的第三方 codec 以插件的方式添加进来,为开发者提供统一接口
  • 4. libavfilter,音视频滤镜库,该模块包含了音频特效和视频特效的处理,在使用 FFmpeg 的 API 进行编解码的过程中,可以使用该模块高效地为音视频数据做特效处理
  • 5. libavdevice,输入输出设备库
  • 6. libswresample,用于音频重采样,可以对数字音频进行声道数、数据格式、采样率等多种基本信息的转换 
  • 7. libswscale,该模块用于图像格式转换
  • 8. libpostproc,该模块用于进行后期处理,当我们使用 filter 的时候,需要打开该模块,filter 会用到该模块的一些基础函数

说明,FFMPEG 的编译详见,【网络通信 -- 直播】项目实战记录 -- 搭建一个简单的视频直播系统 (ubuntu + nginx + nginx_rtmp 模块 + ffmpeg + vlc 播放器)

【2】FFMPEG 常用命令总结

【2.0】FFMPEG 命令查看帮助

ffmpeg 命令查看帮助文档
基本信息,ffmpeg -h
高级信息,ffmpeg -h long
所有信息,ffmpeg -h full
重定向帮助信息,ffmepg -h full > ffmpeg_h_full.log

【2.1】FFMPEG 命令格式

ffmpeg [全局选项] {[输入文件选项] -i 输入文件} ... {[输出文件选项] 输出文件} ...
ffmpeg [global_options] {[input_file_options] -i input_file} ... {[output_file_options] output_file} ...

主要参数

  • -f fmt(输入/输出),强制输入或输出文件格式
    • 格式通常是自动检测输入文件,并从输出文件的文件扩展名中推断;
  • -i url(输入),输入文件的网址
  • -y(全局参数),覆盖输出文件而不询问
  • -n(全局参数),不要覆盖输出文件
    • 如果指定的输出文件已经存在,则立即退出
  • -c [:stream_specifier] codec(输入/输出,每个流),选择一个编码器(当在输出文件之前使用)或解码器(当在输入文件之前使用时)用于一个或多个流
    • codec 是解码器/编码器的名称或 copy(仅输出)以指示该流不被重新编码
  • -codec [:stream_specifier] 编解码器(输入/输出,每个流),同 -c
  • -t duration(输入/输出)
    • 当用作输入选项(在-i之前)时,限制从输入文件读取的数据的持续时间
    • 当用作输出选项时(在输出url之前),在持续时间到达持续时间之后停止输出
  • -ss位置(输入/输出)
    • 当用作输入选项时(在-i之前),在这个输入文件中寻找位置, 请注意,在大多数格式中,不可能精确搜索,因此ffmpeg将在位置之前寻找最近的搜索点;
      • 当转码和-accurate_seek被启用时(默认),搜索点和位置之间的这个额外的分段将被解码和丢弃
      • 当进行流式复制或使用-noaccurate_seek时,将被保留;
    • 当用作输出选项(在输出url之前)时,解码但丢弃输入,直到时间戳到达位置;
  • -frames [:stream_specifier] framecount(output,per-stream),停止在帧计数帧之后写入流
  • -filter [:stream_specifier] filtergraph(output,per-stream),创建由filtergraph指定的过滤器图,并使用它来过滤流;
    • filtergraph是应用于流的filtergraph的描述,并且必须具有相同类型的流的单个输入和单个输出;在过滤器图形中,输入与标签中的标签相关联,标签中的输出与标签相关联;

视频参数

  • -vframes num(输出),设置要输出的视频帧的数量
  • -r [:stream_specifier] fps(输入/输出,每个流),设置帧率(Hz值,分数或缩写);
    • 作为输入选项,忽略存储在文件中的任何时间戳,根据速率生成新的时间戳;
    • 作为输出选项,复制或丢弃输入帧以实现恒定输出帧率 fps
  • -s [:stream_specifier]大小(输入/输出,每个流),设置窗口大小;
    • 作为输入选项,是video_size专用选项的快捷方式,由某些分帧器识别,其帧尺寸未被存储在文件中;
    • 作为输出选项,将缩放视频过滤器插入到相应过滤器图形的末尾
  • -aspect [:stream_specifier] 宽高比(输出,每个流),设置方面指定的视频显示宽高比;
    • aspect可以是浮点数字符串,也可以是num:den形式的字符串,其中num和den是宽高比的分子和分母;例如“4 : 3”,“16 : 9”,“1.3333”和“1.7777”是有效的参数值;
    • 若与-vcodec副本一起使用,则会影响存储在容器级别的宽高比,但不会影响存储在编码帧中的宽高比
  • -vn(输出),禁用视频录制
  • -vcodec编解码器(输出),设置视频编解码器,是-codec:v的别名
  • -vf filtergraph(输出),创建由filtergraph指定的过滤器图,并使用其过滤流

音频参数

  • -aframes(输出),设置要输出的音频帧的数量,是-frames:a的一个过时的别名
  • -ar [:stream_specifier] freq(输入/输出,每个流),设置音频采样频率;
    • 对于输出流,默认设置为相应输入流的频率;
    • 对于输入流,此选项仅适用于音频捕获设备和原始分路器,并映射到相应的分路器选件
  • -ac [:stream_specifier]通道(输入/输出,每个流),设置音频通道的数量;
    • 对于输出流,默认设置为输入音频通道的数量;
    • 对于输入流,此选项仅适用于音频捕获设备和原始分路器,并映射到相应的分路器选件
  • -an(输出),禁用录音
  • -acodec编解码器(输入/输出),设置音频编解码器,是-codec : a 的别名
  • -sample_fmt [:stream_specifier] sample_fmt(输出,每个流),设置音频采样格式;使用-sample_fmts获取支持的样本格式列表
  • -af filtergraph(输出),创建由filtergraph指定的过滤器图,并使用其过滤流

【2.2】FFMPEG 命令示例

【2.2.0】基本查询命令

参数说明
-version显示版本
-formats显示可用的格式(包括设备)
-demuxers显示可用的demuxers 
-muxers显示可用的muxers 
-devices显示可用的设备 
-codecs显示libavcodec已知的所有编解码器 
-decoders显示可用的解码器 
-encoders显示所有可用的编码器 
-bsfs显示可用的比特流filter 
-protocols显示可用的协议
-filters显示可用的libavfilter过滤器 
-pix_fmts显示可用的像素格式 
-sample_fmts显示可用的采样格式 
-layouts显示channel名称和标准channel布局 
-colors显示识别的颜色名称

【2.2.1】设备查询

查看设备列表
linux
ffmpeg -f video4linux2 -devices true -i ""
windows
ffplay -f dshow -i video="EP28WD"

【2.2.2】录制

录制视频
ffmpeg -framerate 30 -f video4linux2 -i /dev/video0 camera_video_1.mp4

【2.2.3】分解与复用

抽取音频流
ffmpeg -i video_1.mp4 -acodec copy -vn video_1_get_audio_aac.aac
抽取视频流
ffmpeg -i video_1.mp4 -vcodec copy -an video_1_get_video_h264.h264
视频格式转换
ffmpeg -i video_1.mp4 -vcodec copy -acodec copy video_1_mp4_2_flv.flv
音视频合并
ffmpeg -i video_1_get_video_h264.h264 -i video_1_get_audio_aac.aac -vcodec copy -acodec copy video_1_combine_mp4.mp4

ffmpeg 命令提取音视频数据

保留封装格式
ffmpeg -i test.mp4 -acodec copy -vn audio.mp4
ffmpeg -i test.mp4 -vcodec copy -an video.mp4

提取视频
保留编码格式:ffmpeg -i test.mp4 -vcodec copy -an test_copy.h264
强制格式:ffmpeg -i test.mp4 -vcodec libx264 -an test.h264

提取音频
保留编码格式:ffmpeg -i test.mp4 -acodec copy -vn test.aac
强制格式:ffmpeg -i test.mp4 -acodec libmp3lame -vn test.mp3

【2.2.4】处理原始数据

提取 YUV 数据
ffmpeg -i video_1.mp4 -an -c:v rawvideo -pixel_format yuv420p video_1_yuv.yuv
ffplay -f rawvideo -video_size 1280x720 video_1_yuv.yuv
YUV 转 H264
ffmpeg -f rawvideo -pix_fmt yuv420p -s 1280x720 -r 30 -i video_1_yuv.yuv -c:v libx264 -f rawvideo video_1_yuv_2_h264.h264

提取YUV
提取3秒数据,分辨率和源视频一致
ffmpeg -i test_1280x720.mp4 -t 3 -pix_fmt yuv420p yuv420p_orig.yuv
提取3秒数据,分辨率转为320x240
ffmpeg -i test_1280x720.mp4 -t 3 -pix_fmt yuv420p -s 320x240 yuv420p_320x240.yuv

提取RGB
提取3秒数据,分辨率转为320x240
ffmpeg -i test.mp4 -t 3 -pix_fmt rgb24 -s 320x240 rgb24_320x240.rgb

RGB和YUV之间的转换
ffmpeg -s 320x240 -pix_fmt yuv420p -i yuv420p_320x240.yuv -pix_fmt rgb24 rgb24_320x240_2.rgb

提取 PCM 数据
ffmpeg -i video_1.mp4 -vn -ar 44100 -ac 2 -f s16le video_1_get_audio_pcm.pcm
ffplay -ar 44100 -ac 2 -f s16le -i video_1_get_audio_pcm.pcm
PCM 转 WAV
ffmpeg -f s16le -ar 44100 -ac 2 -i video_1_get_audio_pcm.pcm video_1_get_audio_pcm_2_wav.wav
ffplay -ar 44100 -ac 2 -f s16le -i video_1_get_audio_pcm_2_wav.wav
WAV 转 PCM
ffmpeg -i video_1_get_audio_pcm_2_wav.wav -f s16le video_1_get_audio_pcm_2_wav_2_pcm.pcm
ffplay -ar 44100 -ac 2 -f s16le -i video_1_get_audio_pcm_2_wav_2_pcm.pcm

【2.2.5】特效

添加滤镜
ffmpeg -i video_1.mp4 -vf "movie=logo.png,scale=64:48[watermask];[in][watermask] overlay=30:10 [out]" video_1_filter_add_logo.mp4
删除滤镜
ffplay -i video_1_filter_add_logo.mp4 -vf delogo=x=806:y=20:w=70:h=80:show=1
ffmpeg -i video_1_filter_add_logo.mp4 -vf delogo=x=806:y=20:w=70:h=80 video_1_filter_delete_logo.mp4
视频裁剪
ffmpeg -i video_1.mp4 -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy -video_size 1280x720 video_1_new.mp4
视频倍速
ffmpeg -i video_1.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" video_1_speed2.0.mp4
对称视频
ffmpeg -i video_1.mp4 -filter_complex "[0:v]pad=w=2*iw[a];[0:v]hflip[b];[a][b]overlay=x=w" video_1_duicheng.mp4
画中画
ffmpeg -i video_1.mp4 -i camera_video_1.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 video_1_camera_video_1_new.mp4

【2.2.6】直播

FFMPEG 摄像头直播
RTSP
linux
ffmpeg -re -i /dev/video0 -vcodec h264 -f flv -f rtsp rtsp://172.16.3.68:1900/myapp/linux_rtsp_camera_0
ffmpeg -i /dev/video0 -c:v libx264 -r 25 -s 640x480 -f flv -f rtsp rtsp://172.16.3.68:1900/myapp/linux_rtsp_camera_0
windows
ffmpeg -f dshow -i video="EP28WD" -c:v libx264 -r 25 -s 640x480 -f flv -f rtsp rtsp://172.16.3.68/myapp/windows_rtsp_camera_0

RTMP
linux
ffmpeg -re -i /dev/video0 -vcodec h264 -f flv -f rtmp://172.16.3.68:1900/myapp/linux_rtmp_camera_0
windows
ffmpeg -f dshow -i video="EP28WD" -vcodec libx264 -r 25 -s 640x480 -f flv rtmp://172.16.3.68:1900/myapp/windows_rtmp_camera_0

FFMPEG 视频文件直播
RTSP
linux/windows
ffmpeg -re -i video_2.mp4 -vcodec h264 -f rtsp rtsp://172.16.3.68/linux_rtsp_video_2_mp4
ffmpeg -re -i video_2.mp4 -rtsp_transport tcp -vcodec h264 -f rtsp rtsp://172.16.3.68/linux_rtsp_video_2_mp4

RTMP
linux/windows
ffmpeg -i media_test_1.mp4 -c:v libx264 -r 25 -g 100 -profile baseline -c:a libfdk_aac -ac 2 -ar 48000 -f flv rtmp://172.26.148.231:1935/live/test

FFMPEG 视频文件直播 -- 指定编解码器,去除 B 帧
H264 - RTMP
ffmpeg -re -i media_file.mp4 -c:v libx264 -bf 0 -s 640x360 -r 30 -c:a libfdk_aac -ac 2 -ar 48000 -f flv rtmp://127.0.0.1:1935/live/livestream
H264 - RTSP
ffmpeg -re -i media_file.mp4 -c:v libx264 -bf 0 -s 640x360 -r 30 -c:a libfdk_aac -ac 2 -ar 48000  -f rtsp -rtsp_transport tcp rtsp://127.0.0.1:554/live/livestream
H265 - RTMP
ffmpeg -re -i media_file.mp4 -c:v libx265 -bf 0 -s 640x360 -r 30 -c:a libfdk_aac -ac 2 -ar 48000 -f flv rtmp://127.0.0.1:1935/live/livestream
h265 - RTSP
ffmpeg -re -i media_file.mp4 -c:v libx265 -bf 0 -s 640x360 -r 30 -c:a libfdk_aac -ac 2 -ar 48000  -f rtsp -rtsp_transport tcp rtsp://127.0.0.1:554/live/livestream

FFMPEG 视频文件直播 -- 开启硬件加速,去除 B 帧
H264 - RTMP
ffmpeg -re -i media_file.mp4 -vcodec h264_nvenc -bf 0 -s 640x360 -r 30 -c:a libfdk_aac -ac 2 -ar 48000 -f flv rtmp://127.0.0.1:1935/live/livestream
H264 - RTSP
ffmpeg -re -i media_file.mp4 -c:v h264_nvenc -bf 0 -s 640x360 -r 30 -c:a libfdk_aac -ac 2 -ar 48000  -f rtsp -rtsp_transport tcp rtsp://127.0.0.1:554/live/livestream
H265 - RTMP
ffmpeg -re -i media_file.mp4 -c:v hevc_nvenc -bf 0 -s 640x360 -r 30 -c:a libfdk_aac -ac 2 -ar 48000 -f flv rtmp://127.0.0.1:1935/live/livestream
H265 - RTSP
ffmpeg -re -i media_file.mp4 -c:v hevc_nvenc  -bf 0 -s 640x360 -r 30 -c:a libfdk_aac -ac 2 -ar 48000  -f rtsp -rtsp_transport tcp rtsp://127.0.0.1:554/live/livestream

【2.2.7】转封装

保持编码格式
ffmpeg -i test.mp4 -vcodec copy -acodec copy test_copy.ts
ffmpeg -i test.mp4 -codec copy test_copy2.ts

改变编码格式
ffmpeg -i test.mp4 -vcodec libx265 -acodec libmp3lame out_h265_mp3.mkv

修改帧率
ffmpeg -i test.mp4 -r 15 output2.mp4

修改视频码率
ffmpeg -i test.mp4 -b 400k output_b.mkv (此时音频也被重新编码)
ffmpeg -i test.mp4 -b:v 400k output_bv.mkv

修改音频码率
ffmpeg -i test.mp4 -b:a 192k output_ba.mp4
如果不想重新编码 video,需要加上 -vcodec copy

修改音视频码率
ffmpeg -i test.mp4 -b:v 400k -b:a 192k output_bva.mp4

修改视频分辨率
ffmpeg -i test.mp4 -s 480x270 output_480x270.mp4

修改音频采样率
ffmpeg -i test.mp4 -ar 44100 output_44100hz.mp4
转封装 -- 去除 B 帧
ffmpeg -i test_file_1.flv -vcodec libx264 -x264opts "bframes=0" -acodec copy test_file_1_no_b.flv

转封装 -- 修改音频参数
ffmpeg -i test_file_1.flv -acodec libfdk_aac -ac 1 -ar 16000 test_file_1_audio_1c_16k.flv

【2.2.8】图片和视频转换

截取一张图片
ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.jpg
ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.bmp
    -i 输入
    -y 覆盖
    -f 格式
    -ss 起始值
    -vframes 帧 如果大于1 那么 输出加%03d test%03d.jpg
    -s 格式大小size

转换视频为图片(每帧一张图):
ffmpeg -i test.mp4 -t 5 -s 640x360 -r 15 frame%03d.jpg

图片转换为视频:
ffmpeg -f image2 -i frame%03d.jpg -r 25 video.mp4

从视频中生成GIF图片
ffmpeg -i test.mp4 -t 5 -r 1 image1.gif
ffmpeg -i test.mp4 -t 5 -r 25 -s 640x360 image2.gif

将 GIF 转化为 视频
ffmpeg -f gif -i image2.gif image2.mp4

【3】FFPLAY 常用命令总结

【3.0】FFPLAY 查看帮助文档

ffplay -h,查看所有帮助信息

【3.1】FFPLAY 命令格式

ffplay [options] input_file

参数

  • -x width,强制显示宽带
  • -y height,强制显示高度
  • -video_size size,帧尺寸,设置显示帧存储(WxH格式),仅适用于类似原始YUV等没有包含帧大小(WxH)的视频
    • 比如: ffplay -pixel_format yuv420p -video_size 320x240 -framerate 5 yuv420p_320x240.yuv
  • -pixel_format format,设置像素格式
  • -fs,以全屏模式启动
  • -an,禁用音频(不播放声音)
  • -vn,禁用视频(不播放视频)
  • -sn,禁用字幕(不显示字幕)
  • -ss pos,根据设置的秒进行定位拖动,
    • 注意时间单位:比如'55' 即 55seconds, '12:03:45' 即 12 hours, 03 minutes and 45 seconds, '23.189',23.189seconds
  • -t duration,设置播放视频/音频长度
  • -bytes,按字节进行定位拖动(0=off 1=on -1=auto)
  • -seek_interval interval,自定义左/右键定位拖动间隔(以秒为单位),默认值为10秒
  • -nodisp,关闭图形化显示窗口,视频将不显示
  • -noborder,无边框窗口
  • -volume vol,设置起始音量,音量范围[0~100]
  • -f fmt,强制使用设置的格式进行解析,比如 -f s16le
  • -window_title title,设置窗口标题(默认为输入文件名)
  • -loop number,设置播放循环次数
  • -showmode mode,设置显示模式,可用的模式值:0 显示视频,1 显示音频波形,2 显示音频频谱;缺省为0,如果视频不存在则自动选择 2
  • -vf filtergraph,设置视频滤镜
  • -af filtergraph,设置音频滤镜
  • -stats,打印多个回放统计信息,包括显示流持续时间,编解码器参数,流中的当前位置,以及音频/视频同步差值;
    • 默认情况下处于启用状态,要显式禁用则需要指定-nostats
  • -fast,非标准化规范的多媒体兼容优化
  • -genpts,生成pts
  • -sync type,同步类型,将主时钟设置为audio(type=audio), video(type=video)或 external(type=ext),默认是audio为主时钟
  • -ast audio_stream_specifier,指定音频流索引,比如 -ast 3,播放流索引为3的音频流
  • -vst video_stream_specifier,指定视频流索引,比如 -vst 4,播放流索引为4的视频流
  • -sst subtitle_stream_specifier,指定字幕流索引,比如 -sst 5,播放流索引为5的字幕流
  • -autoexit,视频播放完毕后退出
  • -exitonkeydown,键盘按下任何键退出播放
  • -exitonmousedown,鼠标按下任何键退出播放
  • -codec:media_specifier codec_name,强制使用设置的多媒体解码器,media_specifier 可用值为 a(音频), v(视频)和 s 字幕;
    • 比如 -codec:v h264_qsv 强制视频采用h264_qsv解码
  • -acodec codec_name,强制使用设置的音频解码器进行音频解码
  • -vcodec codec_name,强制使用设置的视频解码器进行视频解码
  • -scodec codec_name,强制使用设置的字幕解码器进行字幕解码
  • -autorotate,根据文件元数据自动旋转视频,值为0或1,默认为1
  • -framedrop,如果视频不同步则丢弃视频帧;当主时钟非视频时钟时默认开启;若需禁用则使用 -noframedrop
  • -infbuf,不限制输入缓冲区大小;尽可能快地从输入中读取尽可能多的数据;
    • 播放实时流时默认启用,如果未及时读取数据,则可能会丢弃数据;
    • 此选项将不限制缓冲区的大小,若需禁用则使用-noinfbuf

【3.2】FFPLAY 播放控制

【3.3】常用命令示例

播放本地文件
ffplay -window_title "test time" -ss 2 -t 10 -autoexit test.mp4
ffplay buweishui.mp3

播放网络流
ffplay -window_title "rtmp stream" rtmp://202.69.69.180:443/webcast/bshdlive-pc

强制解码器
mpeg4解码器:ffplay -vcodec mpeg4 test.mp4
h264解码器:ffplay -vcodec h264 test.mp4

禁用音频或视频
禁用音频:ffplay test.mp4 -an
禁用视频:ffplay test.mp4 -vn

播放YUV数据
ffplay -pixel_format yuv420p -video_size 320x240 -framerate 5 yuv420p_320x240.yuv

播放RGB数据
ffplay -pixel_format rgb24 -video_size 320x240 -i rgb24_320x240.rgb
ffplay -pixel_format rgb24 -video_size 320x240 -framerate 5 -i rgb24_320x240.rgb

播放PCM数据
ffplay -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm
    -ar set audio sampling rate (in Hz) (from 0 to INT_MAX) (default 0)
    -ac set number of audio channels (from 0 to INT_MAX) (default 0)

播放开启硬件解码加速
ffplay -vcodec h264_cuvid -i rtmp://127.0.0.1:1935/live/livestream
ffplay -vcodec hevc_cuvid -i rtmp://127.0.0.1:1935/live/livestream

ffplay 简单过滤器

视频旋转
ffplay -i test.mp4 -vf transpose=1
视频反转
ffplay test.mp4 -vf hflip
ffplay test.mp4 -vf vflip
视频旋转和反转
ffplay test.mp4 -vf hflip,transpose=1
音频变速播放
ffplay -i test.mp4 -af atempo=2
视频变速播放
ffplay -i test.mp4 -vf setpts=PTS/2
音视频同时变速
ffplay -i test.mp4 -vf setpts=PTS/2 -af atempo=2

【4】FFPROBE 常用命令总结

【4.0】FFPROBE 查看帮助文档

ffprobe -h,查看所有信息

【4.1】FFPROBE 命令格式

ffprobe [OPTIONS] [INPUT_FILE]

问题与解决方案

问题 1,执行FFmpeg命令时报错:No such filter: 'drawtext'

解决方案,执行FFmpeg命令时报错:No such filter: 'drawtext'

【附录】FFMPEG 中的码率控制

固定 QP (Constant QP, CQP)
量化参数 (Quantization Parameter, QP) 控制压缩大小,QP 越大压缩率越高同时质量越低,QP 越小压缩率越低同时质量越高;

在 H.264 和 H.265 中,QP 的范围是 0-51 间的整数

ffmpeg -i <input> -c:v libx264 -qp 23 <output>
ffmpeg -i <input> -c:v libx265 -x265-params qp=23 <output>

平均比特率 (Average Bitrate, ABR)

ffmpeg -i <input> -c:v libx264 -b:v 1M <output>
ffmpeg -i <input> -c:v libx265 -b:v 1M <output>

恒定码率 (Constant Bitrate, CBR)

ffmpeg -i <input> -c:v libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v 1M
 -minrate 1M -maxrate 1M -bufsize 2M <output>

2-Pass Average Bitrate (2-Pass ABR)

H.264
ffmpeg -i <input> -c:v libx264 -b:v 1M -pass 1 -f null /dev/null
ffmpeg -i <input> -c:v libx264 -b:v 1M -pass 2 <output>.mp4

H.265
ffmpeg -i <input> -c:v libx265 -b:v 1M -x265-params pass=1 -f null /dev/null
ffmpeg -i <input> -c:v libx265 -b:v 1M -x265-params pass=2 <output>.mp4

Constant Quality (CQ) / Constant Rate Factor (CRF)

在 H.264 和 H.265 中,CRF 取值为 0 到 51 间的整数 (和 QP 类似)
x264 默认值是 23,x265 默认值是 28

ffmpeg -i <input> -c:v libx264 -crf 23 <output>
ffmpeg -i <input> -c:v libx265 -crf 28 <output>

VBV (Video Buffering Verifier)

ffmpeg -i <input> -c:v libx264 -crf 23 -maxrate 1M -bufsize 2M <output>
ffmpeg -i <input> -c:v libx265 -crf 28 -x265-params vbv-maxrate=1000:vbv-bufsize=2000 <output>

资料链接

【1】FFMPEG 官方文档

【2】FFMPEG 官方 Wiki

【3】FFMPEG 翻译文档

【4】雷霄骅 -- 雷神博客

参考致谢

本博客为博主的学习实践总结,并参考了众多博主的博文,在此表示感谢,博主若有不足之处,请批评指正。

【1】福优学苑 -- 音视频资料

【2】FFMPEG常用命令

【3】ffmpeg给视频添加时间水印

【4】执行FFmpeg命令时报错:No such filter: 'drawtext'

【5】FFplay命令 ---- 播放与参数选项

【6】码率控制(一):理解码率控制模式(x264,x264,vpx)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值