ffmpeg笔记(三)ffmpeg指令总结

简介: ffmpeg笔记(三)ffmpeg指令总结

参数汇总:

-i 设定输入流
-f 设定输出格式(format)
-ss 开始时间
-t 时间长度
-aframes 设置要输出的音频帧数
-b:a 音频码率
-ar 设定采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,如果用copy表示原始编解码数据必须被拷贝。
-an 不处理音频
-af 音频过滤器
-vframes 设置要输出的视频帧数
-b 设定视频码率
-b:v 视频码率
-r 设定帧速率
-s 设定画面的宽与高
-vn 不处理视频
-aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777
-vcodec 设定视频编解码器,如果用copy表示原始编解码数据必须被拷贝。
-vf 视频过滤器

播放本地文件

ffplay -window_title "sunx test_time" -ss 2 -t 10 -autoexit test.mp4(-ss表示起始秒)

强制解码器

mpeg4解码器:ffplay  -vcodec mpeg4 test.mp4(使用mpeg4转码)
h264解码器:ffplay -vcodec h264 test.mp4  (使用h264转码)

禁用音频或视频

禁用音频:ffplay test.mp4 -an (audio)
禁用视频:ffplay test.mp4 -vn (video)

播放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)

yuv测试:

1、获取YUV:ffmpeg -i test.mp4  -pix_fmt yuv420p yuv420p_orig.yuv(test分辨率为1280*720)
2、播放YUV:  ffplay -pix_fmt yuv420p -video_size 1280*720 -framerate 5 yuv420p_orig.yuv

保留封装格式,只要音频:

ffmpeg -i test.mp4 -acodec copy -vn audio.mp4

保留封装格式,只要视频:

ffmpeg -i test.mp4 -vcodec copy -an video.mp4

h264测试(仅提取视频):

1.1、ffmpeg -i test.mp4 -vcodec copy -an test_copy.h264(保留编码格式)
1.2、ffplay copy.h264
2.1、ffmpeg -i test.mp4 -vcodec libx264 -an test.h264(强制格式)
2.2、ffplay test.h264

acc测试(仅提取音频):

1.1、ffmpeg -i test.mp4 -acodec copy -vn test.aac(保留编码格式)
1.2、ffplay test.aac
2.1、ffmpeg -i test.mp4 -acodec libmp3lame -vn test.mp3(强制格式)
2.2、ffplay test.mp3

音频测试:

1、获取音频: ffmpeg -i test.mp4 -vn -ac 2 -f f32le 48000_2_f32le_2.pcm
2、播放音频:ffplay -ar 48000 -ac 2 -f f32le  48000_2_f32le_2.pcm

视频向右旋转90度

ffplay -i test.mp4 -vf transpose=1

视频左右翻转

ffplay test.mp4 -vf hflip

视频上下颠倒

ffplay test.mp4 -vf vflip

视频旋转和反转

ffplay test.mp4 -vf hflip,transpose=1

音频2倍速播放

ffplay -i test.mp4 -af atempo=2

视频2倍速播放

ffplay -i test.mp4 -vf setpts=PTS/2

音视频同时2倍速

ffplay -i test.mp4 -vf setpts=PTS/2 -af atempo=2

ts测试(保持编码格式)

ffmpeg -i test.mp4 -vcodec copy -acodec copy test_copy.ts
fflpay test_copy.ts
ffmpeg -i test.mp4 -codec copy test_copy2.ts
ffplay test_copy2.ts

ts测试(改变编码格式)

ffmpeg -i test.mp4 -vcodec libx265 -acodec libmp3lame out_h265_mp3.ts
ffplay out_h265_mp3.ts

提取ES流

ffmpeg -i 1.ts -vcodec copy -an -f rawvideo es.raw

若输入文件为MP4 + H264,需要加-vbsf h264_mp4toannexb选项(H265为 -vbsf hevc_mp4toannexb )将AVCC(HVCC)格式转为Annex B

ffmpeg -i 1.mp4 -vcodec copy -an -f rawvideo -vbsf h264_mp4toannexb es.raw

修改帧率:

ffmpeg -i test.mp4 -r 15 -codec copy output.mp4 (错误命令)
ffmpeg -i test.mp4 -r 15 output2.mp4

修改音频码率

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

以MP4格式进行拼接

方法2:ffmpeg -fconcat -i mp4list.txt -codec copy out_mp42.mp4

以TS格式进行拼接

方法1:ffmpeg -i"concat:1.ts|2.ts|3.ts" -codec copy out_ts.mp4   
方法2:ffmpeg -fconcat -itslist.txt -codec copy out_ts2.mp4

以FLV格式进行拼接

ffmpeg -fconcat -iflvlist.txt -codec copy out_flv2.mp4

修改音频编码

ffmpeg -i 2.mp4 -vcodec copy -acodec ac3 -vbsf h264_mp4toannexb 2.ts

修改音频采样率

ffmpeg -i 2.mp4 -vcodec copy -acodec aac -ar 96000 -vbsf h264_mp4toannexb 2.ts

修改视频编码格式

ffmpeg -i 1.mp4 -acodec copy -vcodec libx265 1.ts

修改视频分辨率

ffmpeg -i 1.mp4 -acodec copy -vcodec libx264 -s 800x472 -vbsfh264_mp4toannexb 1.ts

截取一张图片

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 格式 image2 一种格式

-ss 起始值

-vframes 帧 如果大于1 那么 输出加%03d test%03d.jpg

-s 格式大小size

-vf 视频过滤器

-af 音频过滤器

视频转换为图片(-r表示帧率,可修改):

ffmpeg -i test.mp4 -t 5 -s 640x360 -r 15 frame%03d.jpg
ffmpeg -i test.mp4 -t 5 -s 640x360 -r 15 image2.gif

图片转换为视频:

ffmpeg -f image2 -i frame%03d.jpg-r 25 video.mp4
ffmpeg -f gif -i image2.gif  image2.mp4

将文字的水印加在视频的左上角:

ffplay -i test.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':x=20:y=20"

将字体的颜色设置为绿色:

ffplay -i test.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green"

如果想调整文字水印显示的位置,调整x与y参数的数值即可。

ffplay -i test.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:x=400:y=200"

修改透明度

ffplay -i test.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:x=400:y=200:alpha=0.5"

文字水印还可以增加一个框,然后给框加上背景颜色:

ffplay -i test.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:box=1:boxcolor=yellow"

每3秒钟显示一次文字水印:

ffplay -i test.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='test':fontcolor=green:box=1:boxcolor=yellow:enable=lt(mod(t\,3)\,1)"

文字水印跑马灯效果:

ffplay -i test.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='helloworld':x=mod(100*t\,w):y=abs(sin(t))*h*0.7"

修改字体透明度,修改字体颜色

ffplay -i test.mp4 -vf "drawtext=fontsize=40:fontfile=FreeSerif.ttf:text='liaoqingfu':x=mod(50*t\,w):y=abs(sin(t))*h*0.7:alpha=0.5:fontcolor=white:enable=lt(mod(t\,3)\,1)"

添加图片水印:

ffmpeg -i test.mp4 -vf "movie=test.jpg[watermark];[in][watermark]overlay=x=10:y=10[out]" output.mp4
Ø 原始视频文件路径:input.mp4
Ø 水印图片路径:logo.png
Ø 水印位置:(x,y)=(10,10)<=(left,top)距离左侧、顶部各10像素;
Ø 输出文件路径:output.mp4

在FFmpeg中加入图片水印有两种方式,一种是通过movie指定水印文件路径,另外一种方式是通过filter读取输入文件的流并指定为水印

图片logo.png将会打入到input.mp4视频中,显示在x坐标50、y坐标20的位置

ffplay -i test.mp4 -vf "movie=test.jpg[logo];[in][logo]overlay=50:10[out]"

左上水印:

ffplay -i test.mp4 -vf "movie=test.jpg[watermark];[in][watermark]overlay=10:10[out]"

右上水印:

ffplay -i test.mp4 -vf "movie=test.jpg[watermark];[in][watermark]overlay=main_w-overlay_w-10:10[out]"

左下水印:

ffplay -i test.mp4 -vf "movie=test.jpg[watermark];[in][watermark]overlay=10:main_h-overlay_h-10[out]"

右下水印:

ffplay -i test.mp4 -vf "movie=test.jpg[watermark];[in][watermark]overlay=main_w-overlay_w-10:main_h-overlay_h-10[out]"

图片水印跑马灯效果

ffplay -i test.mp4 -vf "movie=test.jpg[watermark];[in][watermark]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*h*0.7[out]"

显示画中画效果

ffplay -i test.mp4 -vf "movie=sub_test.mp4[sub];[in][sub]overlay=x=20:y=20[out]"

遇到eof表示时的处理方式,默认为重复

Ø  repeat(值为0):重复前一帧
Ø  endcall(值为1):停止所有的流
Ø  pass(值为2):保留主图层
ffplay -i test.mp4 -vf "movie=sub_test.mp4[sub];[in][sub]overlay=x=20:y=20:eof_action=1[out]"
shortest: 终止最短的视频时全部终止(默认false)
ffplay -i test.mp4 -vf "movie=sub_test.mp4[sub];[in][sub]overlay=x=20:y=20:shortest =1[out]"

视频画中画跑马灯:

ffplay -i test.mp4 -vf "movie=sub_test.mp4[test];[in][test]overlay= x=mod(50*t\,main_w):y=abs(sin(t))*main_h*0.7[out]"

多宫格视频文件:

ffmpeg -i test1.mp4 -i test2.mp4 -i  test3.mp4 -i  test4.mp4 -filter_complex "nullsrc=size=640x480[base];[0:v] setpts=PTS-STARTPTS,scale=320x240[upperleft];[1:v]setpts=PTS-STARTPTS,scale=320x240[upperright];[2:v]setpts=PTS-STARTPTS, scale=320x240[lowerleft];[3:v]setpts=PTS-STARTPTS,scale=320x240[lowerright];[base][upperleft]overlay=shortest=1[tmp1];[tmp1][upperright]overlay=shortest=1:x=320[tmp2];[tmp2][lowerleft]overlay=shortest=1:y=240[tmp3];[tmp3][lowerright]overlay=shortest=1:x=320:y=240" out.mp4

只叠加左上和右上,左下和右下不叠加文件:

ffmpeg -i test1.mp4 -i test2.mp4 -i  test3.mp4 -i  test4.mp4 -filter_complex "nullsrc=size=640x480[base];[0:v]setpts=PTS-STARTPTS,scale=320x240[upperleft];[1:v]setpts=PTS-STARTPTS,scale=320x240[upperright];[base][upperleft]overlay=shortest=1[tmp1];[tmp1][upperright]overlay=shortest=1:x=320" out2.mp4

使用[0:v][1:v][2:v][3:v]将输入的4个视频流去除,分别进行缩放处理,然后基于nullsrc生成的画布进行视频平铺,命令中自定义upperleft,upperright,lowerleft,lowerright进行不同位置平铺。

ffmpeg直播推流:

ffmpeg -re i test.mp4 -c copy flv rtmp://server/live/streamName

ffmpeg直播拉流

ffplay rtmp://server/live/streamName
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv

找三个不同的视频每个视频截取10秒内容

ffmpeg -i test1.mp4 -ss 00:05:00 -t 10 -codec copy 1.mp4
ffmpeg -i test2.mp4 -ss 00:05:00 -t 10 -codec copy 2.mp4
ffmpeg -i test3.mp4 -ss 00:05:00 -t 10 -codec copy 3.mp4

如果音视频格式不统一则强制统一为 -vcodec libx264 -acodec aac

将上述1.mp4/2.mp4/3.mp4转成ts格式

ffmpeg -i 1.mp4 -codec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i 2.mp4 -codec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i 3.mp4 -codec copy -vbsf h264_mp4toannexb 3.ts

转成flv格式

ffmpeg -i 1.mp4 -codec copy 1.flv
ffmpeg -i 2.mp4 -codec copy 2.flv
ffmpeg -i 3.mp4 -codec copy 3.flv


相关文章
|
15天前
|
编解码
FFmpeg开发笔记(三十三)分析ZLMediaKit对H.264流的插帧操作
《FFmpeg开发实战》书中3.4.3节讲解如何将H.264流封装成MP4。H.264流通常以SPS→PPS→IDR帧开始,这一说法通过雷霄骅的H264分析器得到验证。分析器能解析H.264文件但不支持MP4。ZLMediaKit服务器在遇到I帧时会自动插入SPS和PPS配置帧,确保流符合标准格式。若缺少这些帧,客户端拉流时会报错。FFmpeg开发实战:从零基础到短视频上线》书中提供了更多FFmpeg开发细节。
28 0
FFmpeg开发笔记(三十三)分析ZLMediaKit对H.264流的插帧操作
|
2天前
|
Web App开发 缓存 Linux
FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流
《FFmpeg开发实战》书中第10章提及轻量级流媒体服务器MediaMTX,适合测试RTSP/RTMP协议,但不适合生产环境。推荐使用SRS或ZLMediaKit,其中SRS是国产开源实时视频服务器,支持多种流媒体协议。本文简述在华为欧拉系统上编译安装SRS和FFmpeg的步骤,包括安装依赖、下载源码、配置、编译以及启动SRS服务。此外,还展示了如何通过FFmpeg进行RTMP推流,并使用VLC播放器测试拉流。更多FFmpeg开发内容可参考相关书籍。
11 2
FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流
|
8天前
|
Linux Apache C++
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
该文介绍了如何在Windows环境下为FFmpeg集成SRT协议支持库libsrt。首先,需要安装Perl和Nasm,然后编译OpenSSL。接着,下载libsrt源码并使用CMake配置,生成VS工程并编译生成srt.dll和srt.lib。最后,将编译出的库文件和头文件按照特定目录结构放置,并更新环境变量,重新配置启用libsrt的FFmpeg并进行编译安装。该过程有助于优化直播推流的性能,减少卡顿问题。
40 2
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
|
9天前
|
Linux
FFmpeg开发笔记(三十四)Linux环境给FFmpeg集成libsrt和librist
《FFmpeg开发实战》书中介绍了直播的RTSP和RTMP协议,以及新协议SRT和RIST。SRT是安全可靠传输协议,RIST是可靠的互联网流传输协议,两者于2017年发布。腾讯视频云采用SRT改善推流卡顿。以下是Linux环境下为FFmpeg集成libsrt和librist的步骤:下载安装源码,配置、编译和安装。要启用这些库,需重新配置FFmpeg,添加相关选项,然后编译和安装。成功后,通过`ffmpeg -version`检查版本信息以确认启用SRT和RIST支持。详细过程可参考书中相应章节。
16 1
FFmpeg开发笔记(三十四)Linux环境给FFmpeg集成libsrt和librist
|
22天前
|
编解码 Java Android开发
FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流
RTMP Streamer是一款开源的安卓直播推流框架,支持RTMP、RTSP和SRT协议,适用于各种直播场景。它支持H264、H265、AV1视频编码和AAC、G711、OPUS音频编码。本文档介绍了如何使用Java版的RTMP Streamer,建议使用小海豚版本的Android Studio (Dolphin)。加载项目时,可添加国内仓库加速依赖下载。RTMP Streamer包含五个模块:app、encoder、rtmp、rtplibrary和rtsp。完成加载后,可以在手机上安装并运行APP,提供多种直播方式。开发者可以从《FFmpeg开发实战:从零基础到短视频上线》获取更多信息。
53 7
FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流
|
23天前
|
存储 编解码
FFmpeg开发笔记(三十)解析H.264码流中的SPS帧和PPS帧
《FFmpeg开发实战》书中介绍了音视频编码历史,重点讲述H.264的成功在于其分为视频编码层和网络抽象层。H.264帧类型包括SPS(序列参数集,含视频规格参数),PPS(图像参数集,含编码参数)和IDR帧(立即解码刷新,关键帧)。SPS用于计算视频宽高和帧率,PPS存储编码设置,IDR帧则标志新的解码序列。书中还配以图片展示各帧结构详情,完整内容可参考相关书籍。
47 7
FFmpeg开发笔记(三十)解析H.264码流中的SPS帧和PPS帧
|
1天前
|
编解码
FFmpeg开发笔记(三十七)分析SRS对HLS协议里TS包的插帧操作
《FFmpeg开发实战》书中讲解了音视频封装格式,重点介绍了TS,因其固定长度和独立解码特性,常用于HLS协议。HLS通过m3u8文件指示客户端播放TS分片。SRS服务器在转换MP4至TS时,会在每个TS包头添加SPS和PPS帧,保证解码完整性。这一过程在SrsIngestHlsOutput::on_ts_video函数中体现,调用write_h264_sps_pps和write_h264_ipb_frame完成。详细实现涉及SrsRawH264Stream::mux_sequence_header函数,遵循ISO标准写入SPS和PPS NAL单元。
12 0
FFmpeg开发笔记(三十七)分析SRS对HLS协议里TS包的插帧操作
|
1月前
|
编解码 Linux
FFmpeg开发笔记(二十八)Linux环境给FFmpeg集成libxvid
XviD是开源的MPEG-4视频编解码器,曾与DivX一起用于早期MP4视频编码,但现在已被H.264取代。要集成XviD到Linux上的FFmpeg,首先下载源码,解压后配置并编译安装libxvid。接着,在FFmpeg源码目录中,重新配置FFmpeg以启用libxvid,然后编译并安装。成功后,通过`ffmpeg -version`检查是否启用libxvid。详细步骤包括下载、解压libxvid,使用`configure`和`make`命令安装,以及更新FFmpeg配置并安装。
41 2
FFmpeg开发笔记(二十八)Linux环境给FFmpeg集成libxvid
|
1月前
|
移动开发 小程序 视频直播
FFmpeg开发笔记(二十七)解决APP无法访问ZLMediaKit的直播链接问题
本文讲述了在使用ZLMediaKit进行视频直播时,遇到移动端通过ExoPlayer和微信小程序播放HLS直播地址失败的问题。错误源于ZLMediaKit对HTTP地址的Cookie校验导致401无权限响应。通过修改ZLMediaKit源码,注释掉相关鉴权代码并重新编译安装,解决了此问题,使得ExoPlayer和小程序能成功播放HLS视频。详细解决方案及FFmpeg集成可参考《FFmpeg开发实战:从零基础到短视频上线》一书。
54 3
FFmpeg开发笔记(二十七)解决APP无法访问ZLMediaKit的直播链接问题
|
1月前
|
Web App开发 安全 Linux
FFmpeg开发笔记(二十六)Linux环境安装ZLMediaKit实现视频推流
《FFmpeg开发实战》书中介绍轻量级流媒体服务器MediaMTX,但其功能有限,不适合生产环境。推荐使用国产开源的ZLMediaKit,它支持多种流媒体协议和音视频编码标准。以下是华为欧拉系统下编译安装ZLMediaKit和FFmpeg的步骤,包括更新依赖、下载源码、配置、编译、安装以及启动MediaServer服务。此外,还提供了通过FFmpeg进行RTSP和RTMP推流,并使用VLC播放器拉流的示例。
57 3
FFmpeg开发笔记(二十六)Linux环境安装ZLMediaKit实现视频推流