ffmpeg合流
示例 2个输入流
ffmpeg -re -i "/Users/test/Desktop/test.flv" -i "/Users/test/Desktop/test22.flv" -filter_complex "nullsrc=size=640x480 [base]; [0:v] setpts=PTS-STARTPTS, scale=320x480 [left]; [1:v] setpts=PTS-STARTPTS, scale=320x480 [right]; [base][left] overlay=shortest=1 [tmp1]; [tmp1][right] overlay=shortest=1:x=320" -movflags faststart -c:v libx264 -profile:v high -preset medium -filter_complex amix -c:a aac -f flv "rtmp://127.0.0.1/live/livestream"
示例 4个输入流
ffmpeg -i /Users/test/Desktop/test.flv -i /Users/test/Desktop/test.flv -i /Users/test/Desktop/test.flv -i /Users/test/Desktop/test.flv -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" -movflags faststart -c:v libx264 -profile:v high -preset medium -filter_complex amix -c:a aac -f flv "rtmp://127.0.0.1/live/livestream"
并排显示两路流
ffmpeg -thread_queue_size 128 -i /Users/test/Desktop/test.flv -i /Users/test/Desktop/test22.flv -acodec aac -vcodec libx264 -preset ultrafast -filter_complex "[0:v]pad=w=iw*2:h=ih[b];[b][1:v]overlay=x=W/2" -movflags faststart -c:v libx264 -profile:v high -preset medium -filter_complex amix -c:a aac -f flv "rtmp://127.0.0.1/live/livestream"
mp4中提取h264码流
ffmpeg -i h264.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264
两路流覆盖
ffmpeg -i "rtmp://192.168.20.249:1935/live/livestream" -i "rtmp://192.168.20.249:1935/live/11" -filter_complex overlay=x=W-w:y=H-h -f flv "rtmp://192.168.20.249:1935/live/livestream_11"
ffmpeg -i ~/Movies/objectC/facebook.mp4 -i ~/Downloads/pacopacomama-061816_108-FHD/061816_108-paco-720p.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 b.mp4
注意:这些操作必须开启FFmpeg以下插件功能
–enable-libfdk-aac --enable-libx264
画中画
./ffmpeg -i rtmp://192.168.20.249:1935/live/livestream -i rtmp://192.168.20.249:1935/live/11 -max_muxing_queue_size 1024 -acodec aac -vcodec libx264 -preset ultrafast -profile:v baseline -level 3.1 -g 50 -tune zerolatency -r 25 -b:a 20k -b:v 800k -filter_complex "[1:v]scale=iw/3:ih/3:force_original_aspect_ratio=decrease[com];[0:v][com]overlay=x=W-w:y=H-h[out]" -map "[out]" -filter_complex amix=inputs=2:duration=shortest:dropout_transition=2,volume=1 -movflags faststart -f flv -y rtmp://192.168.20.249:1935/live/livestream_11
ffmpeg rtmp流OR视频加水印
文字水印,输入输出都可以设置为rtmp流地址
ffmpeg -re -i /Users/test/Desktop/test.flv -vf "drawtext=fontsize=50:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':x=20:y=20:fontcolor=green" -c:v libx264 -c:a copy -f flv rtmp://127.0.0.1/live/livestream
图片水印
ffmpeg -re -i /Users/test/Desktop/test33.flv -vf "movie=/Users/test/Desktop/test.jpeg,colorkey=black:1.0:1.0 [wm];[in][wm]overlay=30:10[out]" -c:v libx264 -c:a copy -f flv rtmp://127.0.0.1/live/livestream
ffmpeg常用命令:
-i inputfile 指定输入文件
-r fps 指定帧率
ffmpeg -i input.avi -r 30 output.mp4
ffmpeg -i clip.mpg -vf fps=fps=25 clip.webm --(-vf 就是(video filter) 视频过滤器)
-b bitrate 设置比特率
ffmpeg -i film.avi -b 1.5M film.mp4
ffmpeg -i film.avi -b:v 1.5M -b:a 1M film.mp4
-s 320X240 指定视频大小(视频缩放)
ffmpeg -i input.mpg -s 320x240 output.mp4
ffmpeg -i input.mpg -vf scale=320:240 output.mp4
ffmpeg -i input.mpg -vf scale=iw/2:ih/2 output.mp4
crop 视频裁剪
ffmpeg -i input -vf crop=iw/3:ih:0:0 output --左边三分之一
ffmpeg -i input -vf crop=iw/3:ih:iw/3:0 output --中间三分之一
ffmpeg -i input -vf crop=iw/3:ih:iw/3*2:0 output --右边三分之一
pad 视频填充
ffmpeg -i photo.jpg -vf pad=860:660:30:30:pink framed_photo.jpg
抽帧
ffmpeg.exe -i aa.mp4 -y -f image2 -ss 8 -t 0.01 -s 800x600 test.jpg
ffmpeg -i inputfile.avi -r 1 -f image2 image-%05d.jpeg
画面上半部分翻转到下面输出
ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT
ffmpeg参数
-fflags nobuffer 直接读出或者写出,不存入缓存,降低延迟
-analyzeduration int 指定解析媒体所需要花销的时间
ffmpeg主要模块
libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音
视频帧等功能;音视频的格式解析协议,为 libavcodec 分析码流提供独立的音频或视频码流源。
libavcodec:用于各种类型声音/图像编解码;该库是音视频编解码核心,实现了市面上可见的绝大部分解码器
的功能,libavcodec 库被其他各大解码器 ffdshow,Mplayer 等所包含或应用。
libavdevice : 硬 件 采 集 、 加 速 、 显 示 。 操 作 计 算 机 中 常 用 的 音 视 频 捕 获 或 输 出 设 备 :
ALSA,AUDIO_BEOS,JACK,OSS,1394,VFW。
libavfilter:filter(FileIO、FPS、DrawText)音视频滤波器的开发,如宽高比 裁剪 格式化 非格式化 伸缩。
libavutil:包含一些公共的工具函数的使用库,包括算数运算 字符操作;
libavresample:音视频封转编解码格式预设等。
libswscale:(原始视频格式转换)用于视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换,如 rgb565
rgb888 等与 yuv420 等之间转换。
libswresample:原始音频格式转码
libpostproc:(同步、时间计算的简单算法)用于后期效果处理;音视频应用的后处理,如图像的去块效应。
ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;
ffsever:一个 HTTP 多媒体即时广播串流服务器;
ffplay:是一个简单的播放器,使用 ffmpeg 库解析和解码,通过 SDL 显示
ffmpeg静态库文件编译顺序:(静态库编译存在依赖关系的库注意顺序)
-lavformat -lavfilter -lswscale -lavcodec -lswresample -lpostproc -lavutil -lx264 -lfdk-aac -ldl -lz -llzma -lbz2 -lrt -lpthread -lm
ffmpeg关键数据结构:
解协议:
URLContext主要存储视音频使用的协议的类型以及状态。
URLProtocol存储输入视音频使用的封装格式。
每种协议都对应一个URLProtocol结构
解封装:
AVFormatContext主要存储视音频封装格式中包含的信息;
AVInputFormat存储输入视音频使用的封装格式。
每种视音频封装格式都对应一个AVInputFormat 结构
解码:
每个AVStream存储一个视频/音频流的相关数据;
每个AVStream对应一个AVCodecContext,存储该视频/音频流使用解码方式的相关数据;
每个AVCodecContext中对应一个AVCodec,包含该视频/音频对应的解码器。
每种解码器都对应一个AVCodec结构
存数据:
视频的话,每个结构一般是存一帧;音频可能有好几帧
解码前数据:AVPacket
解码后数据:AVFrame