【音视频】5.ffmpeg命令分类与使用

GT

其实平时也有一些处理音视频的个人或者亲人需求,熟练使用ffmpeg之后也不要借助图示化软件,一个命令基本可以搞定

G: 熟练使用ffmpeg命令!
T :不要死记硬背,看一遍,自己找下规律,敲一遍,用的多了,自然而然就记住了。就算忘了,我也可以查一查_

ffmpeg提供的命令行工具
  • ffprobe:用作信息查询,查看音视频文件中的信息
  • ffplay:是一个使用了FFmpeg和SDL库的媒体播放器,ijkplayer 就是基于ffplay改造二次开发的,多做了一些硬件解码和兼容性的工作。
  • ffmpeg:最重要,最核心。包含各种功能,学习也主要是学习这玩意。
  • ffserver:简单的流媒体服务器,能够响应客户端的流媒体请求和把数据流发送给客户端。
ffprobe

ffprobe [fileName] :直接输出文件信息,很明显,可以看出代表的含义

  # 时长、开始、比特率
  Duration: 00:01:39.96, start: 0.000000, bitrate: 1035 kb/s
  
  # video流,编码格式h264 (封装格式avc1),视频帧格式为yuv420p,分辨率1000x562,比特率、帧率,default代表默认的视频流,可能有多路视频流。
  Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1000x562 [SAR 1:1 DAR 500:281], 935 kb/s, 24 fps, 24 tbr, 12288 tbn, 48 tbc (default)
  
  # 音频流,编码格式aac(封装格式MP4A),采用Profile是LC,采样率44.1kHZ,stereo立体声,数据表示格式浮点型,比特率
  Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 94 kb/s (default)

ffprobe -show_format [fileName]

ffprobe -show_packets [fileName]

ffprobe -show_frames [fileName]

ffprobe -print_format json -show_streams [fileName]

属性 含义
media_type 帧的类型(a,v,字幕等)
pict_type 帧类型(IPB)
pic_fmt 帧的图像色彩格式(yuv420p)
Key_frame 是否是关键帧
ffplay

播放: ffplay [fileName]
直接播放文件,播放同时会打印音视频流信息,与上面通过ffprobe查看到的一致
1.seek:播放窗口点击
2.快进快退:左右键10s,上下键1min
3.音视频切换:W
4.frame-step:S

循环播放:ffplay [fileName] -loop [times]

切换音视频流:ffplay [fileName] ast/vst [index]

播放音视频裸数据PCM/YUV
ffplay .pcm -f s161e -channels 2 -ar 44100
ffplay -f rawvideo -pixel_format yuv420p/rgb24 -s 1920*1080 [fileName]

音视频同步,以音/视频/外部时钟为参考
ffplay [fileName] -sync audio/video/ext

ffmpeg:最美味的鱼,也是刺最多的。
	ffmpeg -help:可以考到如下几类参数
	# 1.Global options 全局生效,而不是只针对个别文件
	# 2.Per-file main options:操作每个文件单独生效
	-f fmt              指定音视频格式
	-c codec            codec name
	-codec codec        codec name
	-pre preset         preset name
	-map_metadata outfile[,metadata]:infile[,metadata]  set metadata information of outfile from infile
	-t duration         指定时长
	-to time_stop       record or transcode stop time
	-fs limit_size     指定文件大小的上限
	-ss time_off        指定开始时间
	-sseof time_off     set the start time offset relative to EOF
	-seek_timestamp     enable/disable seeking by timestamp with -ss
	-timestamp time     set the recording timestamp ('now' to set the current time)
	-metadata string=string  add metadata
	-program title=string:st=number...  add program with specified streams
	-target type        specify target file type ("vcd", "svcd", "dvd", "dv" or "dv50" with optional prefixes "pal-", "ntsc-" or "film-")
	-apad               audio pad
	-frames number      set the number of frames to output
	-filter filter_graph  set stream filtergraph
	-filter_script filename  read stream filtergraph description from a file
	-reinit_filter      reinit filtergraph on input parameter changes
	-discard            discard
	-disposition        disposition
	
	# 3. Video options: 视频参数
	-vframes number     set the number of video frames to output
	-r rate             帧率fps
	-s size             分辨率
	-aspect aspect      指定视频长宽比(4:3,16:9或1.3333,1.7777)
	-bits_per_raw_sample number  set the number of bits per raw sample
	-vn                 取消视频的输出
	-vcodec codec       强制使用codec编解码方式(‘copy’ 代表不进行重新编码)
	-timecode hh:mm:ss[:;.]ff  set initial TimeCode value.
	-pass n             select the pass number (1 to 3)
	-vf filter_graph    set video filters
	-ab bitrate         audio bitrate (please use -b:a)
	-b bitrate          video bitrate (please use -b:v)
	-dn                 disable data
	
	# 4. Audio options: 音频参数
	-aframes number     set the number of audio frames to output
	-aq quality         设置音频质量 (指定编码)
	-ar rate            设置音频采样率 (单位Hz)
	-ac channels        设置声道数 1单声道  2立体声
	-an                 取消音频输出
	-acodec codec       指定音频编码 ('copy' 指不做音频转码,直接复制)
	-vol volume         设置录制音量大小 (256=normal)
	-af filter_graph    set audio filters
	
	# 5. Subtitle options
查询类命令

-version show version
-buildconf show build configuration
-formats show available formats
-muxers show available muxers
-demuxers show available demuxers
-devices show available devices
-codecs show available codecs
-decoders show available decoders
-encoders show available encoders
-bsfs show available bit stream filters
-protocols show available protocols
-filters show available filters
-pix_fmts show available pixel formats
-layouts show standard channel layouts
-sample_fmts show available audio sample formats
-colors show available color names
-sources device list sources of the input device
-sinks device list sinks of the output device
-hwaccels show available HW acceleration methods

命令格式

ffmpeg [global_options] {[input_file_options] -i input_url} {[output_file_options] output_url}

复用解复用命令

抽取音频流
ffmpeg -i input.mp4 -acodec copy -vn out.aac

抽取视频流
ffmpeg -i input.mp4 -vcodec copy -an out.h264

格式转换
ffmpeg -i input.mp4 -vcodec copy -acodec copy out.flv

音视频合并
ffmpeg -i out.h264 -i out.aac -vcodec copy -acodec copy out.mp4

处理裸数据

#提取YUV数据
ffmpeg -i input.mp4 -an -c:v rawvideo -pixel_format yuv420p out.yuv

#提取PCM数据
ffmpeg -i input.mp5 -vn -ar 44100 -ac 2 -f s16le out.pcm

#yuv转h264
ffmpeg -f rawvideo -pix_fmt yuv420p -s 320x240 -r 30 -i out.yuv -c:v libx264 -f rawvideo out.h264

#pcm转wav
ffmpeg -s16le -ar 8000 -ac 2 -acodec pcm_s16le -i input.raw output.wav

滤镜

#添加水印:-vf中的 movie 指定logo位置。scale 指定 logo 大小。overlay 指定 logo 摆放的位置
ffmpeg -i 1.mp4 -vf “movie=2.png,scale=30:30[watermask];[in][watermask] overlay=30:10[out]” water.mp4

#删除水印
1.找到水印
ffplay -i water.mp4 -vf delogo=x=30:y=10:w=32:h=31:show=1
2.删除水印
ffmpeg -i water.mp4 -vf delogo=x=30:y=10:w=32:h=31output.mp4

#视频缩小1倍:-vf scale 指定使用简单过滤器 scale,iw/2:-1 中的 iw 指定按整型取视频的宽度。 -1 表示高度随宽度一起变化。
ffmpeg -i 1.mp4 -vf scale=iw/2:-1 scale.mp4

视频裁剪
crop 格式:crop=out_w:out_h: x :y
out_w: 输出的宽度。可以使用 in_w 表式输入视频的宽度。
out_h: 输出的高度。可以使用 in_h 表式输入视频的高度。
x : X坐标
y : Y坐标
ffmpeg -i 1.mp4 -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy -video_size 1280x720 out.mp4

倍速播放
-filter_complex 复杂滤镜,[0:v]表示第一个(文件索引号是0)文件的视频作为输入。setpts=0.5PTS表示每帧视频的pts时间戳都乘0.5 ,也就是差少一半。[v]表示输出的别名。音频同理就不详述了。
-map 可用于处理复杂输出,如可以将指定的多路流输出到一个输出文件,也可以指定输出到多个文件。"[v]" 复杂滤镜输出的别名作为输出文件的一路流。上面 map的用法是将复杂滤镜输出的视频和音频输出到指定文件中。
ffmpeg -i 1.mp4 -filter_complex "[0:v]setpts=0.5
PTS[v];[0:a]atempo=2.0[a]" -map “[v]” -map “[a]” speed.mp4

对称视频(水平翻转)
ffmpeg -i 1.mp4 -filter_complex “[0:v]pad=w=2*iw[a];[0:v]hflip[b];[a][b]overlay=x=w” duicheng.mp4

对称视频(垂直翻转)
ffmpeg -i 1.mp4 -filter_complex “[0:v]pad=h=2*ih[a];[0:v]vflip[b];[a][b]overlay=y=h” duicheng.mp4

画中画
ffmpeg -i 1.mp4 -i 2.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 new.mp4

音量效果
ffmpeg -i 1.mp4 -af ‘volume=0.5’ out.mp4

音视频的拼接与裁剪

裁剪
ffmpeg -i 1.mp4 -ss 00:00:00 -t 10 out1.mp4

拼接
text文件:
file ‘out1.flv’
file ‘out2.flv’
file ‘out3.flv’
ffmpeg -f concat -i text -c copy pinjie.mp4

hls切片
-strict -2 指明音频使用AAC。
-f hls 转成 m3u8 格式。
ffmpeg -i 1.mp4 -c:v libx264 -c:a libfdk_aac -strict -2 -f hls out.m3u8

视频图片互转

视频转JPEG
-r 1:1s一张
ffmpeg -i 1.mp4 -r 1 -f image2 image-%3d.jpeg

图片转gif
ffmpeg -i image-%3d.jpeg -r 5 out.gif

视频转gif图
ffmpeg -i 1.mp4 -ss 00:00:00 -t 10 out.gif

图片转视频
ffmpeg -f image2 -i image-%3d.jpeg images.mp4

直播相关

推流
ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/streamName

拉流保存
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv

转流
ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v copy -f flv rtmp://server/live/h264Stream

水平有限,能力一般,且处于学习阶段,博客大概为自己学习的记录,难免有理解偏差,欢迎留言指正!
生命不止,学习不息

展开阅读全文

没有更多推荐了,返回首页