本文主要介绍播放器的使用和调试方式
ffmpeg编译
ffmpeg的编译选项参考:ffmpeg编译选项
具体编译使用命令:
./configure --prefix=build \ --disable-asm \ --disable-programs \ --enable-pic \ --disable-doc \ --enable-shared \ --disable-decoders \ --disable-encoders \ --disable-muxers \ --disable-demuxers \ --disable-filters \ --enable-decoder=aac \ --enable-decoder=mp3 \ --enable-decoder=wma \ --enable-decoder=wav \ --enable-decoder=amr \ --enable-decoder=ogg \ --enable-decoder=pcm \ --enable-decoder=flac\ --enable-decoder=dts \ --enable-decoder=ape \ --enable-decoder=mjpeg \ --enable-decoder=h264 \ --enable-decoder=hevc \ --enable-decoder=vc1 \ --enable-decoder=vp8 \ --enable-decoder=vp9 \ --enable-decoder=mpeg2video \ --enable-decoder=mpeg4 \ --enable-encoder=h264_vaapi \ --enable-encoder=hevc_vaapi \ --enable-encoder=mpeg2_vaapi \ --enable-encoder=mjpeg_vaapi \ --enable-encoder=mpeg4 \ --enable-encoder=vp8_vaapi \ --enable-encoder=vp9_vaapi \ --enable-demuxer=aac \ --enable-demuxer=amr \ --enable-demuxer=avi \ --enable-demuxer=avr \ --enable-demuxer=avs \ --enable-demuxer=avs2 \ --enable-demuxer=h264 \ --enable-demuxer=mjpeg \ --enable-demuxer=mp3 \ --enable-demuxer=mov \ --enable-demuxer=mpegts \ --enable-demuxer=mpegvideo \ --enable-demuxer=ogg \ --enable-demuxer=rawvideo \ --enable-demuxer=rtp \ --enable-demuxer=rtsp \ --enable-demuxer=vc1 \ --enable-demuxer=wav \ --enable-demuxer=xmv \ --enable-demuxer=hevc \ --enable-demuxer=image2 \ --enable-demuxer=spdif \ --enable-muxer=mjpeg \ --enable-muxer=spdif \ --enable-muxer=avi \ --enable-muxer=amr \ --enable-muxer=flv \ --enable-muxer=h264 \ --enable-muxer=hevc \ --enable-muxer=image2 \ --enable-muxer=m4v \ --enable-muxer=mov \ --enable-muxer=mp3 \ --enable-muxer=mp4 \ --enable-muxer=mpeg2video \ --enable-muxer=mpegts \ --enable-muxer=ogg \ --enable-muxer=rawvideo \ --enable-muxer=rtp \ --enable-muxer=rtp_mpegts \ --enable-muxer=rtsp \ --enable-muxer=vc1 \ffmpeg与ffplay命令
将视频转为interlace类型的视频
ffmpeg –i input.avi -vf tinterlace=mode=4:flags=low_pass_filter output.avi视频分辨率转换
ffmpeg -ss time -t duration -i clip_in -vf scale=w:h,setdar=16:9 clip_out -hide_banner 说明: clip_in :输入视频 clip_out :输出视频 w:h:输出的分辨率,建议为16:9查看视频信息
ffprobe -show_packets selcet_streams 0/1/2 clips ffprobe -show_framess selcet_streams 0/1/2 clips ffprobe -show_streams selcet_streams 0/1/2 clips //保存视频streams信息到文件中 ffprobe -i clips -select_streams 0/1/2 -show_streams -print_format json > show_treams.txt //保存视频packets 的data信息到文件中 ffprobe -i clips -select_streams 0/1/2 -show_packets -show_data > show_packets_data.txt //仅仅保存视频streams 的idnex和codec_type信息到文件中 ffprobe -i clips -select_streams 0/1/2 -show_steams -show_entries stream=index,codec_type //仅仅保存视频streams 的idnex和codec_type信息并以xml格式保存到文件中 ffprobe -i clips -select_streams 0/1/2 -show_steams -show_entries stream=index,codec_type -of xml >>info.txt //仅仅保存视频frames的key_frame信息并以xml格式保存到文件中 ffprobe -i clips -select_streams 0/1/2 -show_frames -show_entries frame=key_frame -of xml >>info.txt //仅仅保存视频packet的pts_time和size信息并以json格式保存到文件中 fprobe -i clips -select_streams 0/1/2 -show_packets -show_entries packet=pts_time,size -print_format json> show_packets.txt播放视频和图片
ffplay -vcodec codec clips 说明: clips:需要播放的视频名称 codec :播放视频的解码器 //显示单张图片 ffplay -pix_fmt image_fmts-s wxh image //显示多图片二进制文件 ffplay -f rawvideo -pix_fmt image_fmts -s wxh image.bin视频截取
ffplay -ss start_time -t duration -i clips --pix_fmt format -vf scale=wxh outputclips 说明: start_time :原始视频起始时间 duration :原始视频时间长度 clips:原始视频名称 outputclips:输出视频名称 scale=wxh:视频输出分辨率数据流保存
//保存网络流数据 ffmpeg -rtsp_transport tcp -i rtsp://ip:port/stream -vcodec copy -acodec copy -t 30 -f mp4 rtsp-out.mp4 ffmpeg -re -i clip -vcodec h264 -acodec aac -strict -2 -f rtsp -rtsp_transport tcp rtsp://192.168.0.139/live/test1 //分离audio和video ffmpeg -i clips -acodec -vn xxx.audio ffmpeg -i clips -vcodec -an xxx.video视频帧率和码率转换
ffmpeg -r fps-input -i clip_in -r fps-output ouput ffmpeg -i input -b:v 800k output //单独设置一项其他参数会有变化 说明: fps-input:输入视频fps fps-output:输出视频fps clip_in:输入视频,可以是裸流,也可以是封装视频 ouput:输出视频,一般为mp4,avi等 ffmpeg -i clips -vf 'w=3840:h=2160' -b:v 40M -minrate 40M -maxrate 40M -bufsize 120M -c:v copy-c:a copy output 说明: clip:输入视频,可以是裸流,也可以是封装视频 ouput:输出视频,一般为mp4,avi等视频颜色调整
fmpeg -i input -vf hue=b=1 -s wxh output 说明: input:输入视频 output:输出视频 wxh :输出的尺寸 vf:滤镜模块 hue:调整视频色调、饱和度、亮度 h:色调角度度数(0到360),默认值为0 s:饱和度(-10到10),默认值为1 b:亮度(-10到10),默认值为0 colorbalance:颜色平衡,调整RGB得值的权重,分为三个阶层,用于调整饱和度和调整颜色偏移值 rs、gs、bs:调整红色,绿色和蓝色阴影(最暗的像素)(范围:-1到1) rm、gm、bm:调整红色,绿色和蓝色中间色(中等像素)(范围:-1到1) rh、gh、bh:调整红色,绿色和蓝色的亮点(最亮的像素)(范围:-1到1)图片格式和分辨率调整
fmpeg -i input -pix_fmt fmt -s wxh output ffmpeg -s widthxheight -pix_fmt bayer_bggr8 -i input.bayer -pix_fmt rgb24 output.png ffmpeg -s widthxheight -pix_fmt nv12 -i input.jpg -f rawvideo output.nv12 说明: input:输入图片,一般为jpg和png等,其他格式需要使用pix_fmt指定在-i前面 output: 输出图片名称,后缀可以是rgb,yuv,bayer(bayer格式支持输入不支持输出) fmt:ffmpeg支持的格式,使用ffmpeg -pix_fmts查看 wxh:输出图片尺寸视频截图
fmpeg -i input -ss start -t time -r fps -s wxh output fmpeg -i input -ss start -vframes cnt -s wxh output fmpeg -i input -ss start -f segment -segment_time 0.01 -frames framecnt -s wxh output 说明: input:输入视频 ss: 开始截图时间 -t: 截图时长 -r:截图帧率 -s:输出尺寸 -vframes / -frames:截图数量 output:如IMAGE-%05d.jpg或者png,如果是yuv格式只输出一个文件视频提取
ffmpeg -i input.mp4 -vn -c:a copy output.aac ffmpeg -i input.mp4 -an -c:v copy output.mp4 //提取h264裸流 ffmpeg -i input.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 output.264 说明: input:输入视频 -vn/an 禁止视频 -c:a copy output:视频名称视频帧提取
ffprobe -v quiet -show_frames transcoded123.mp4 | grep "pict_type=type" | wc -l 说明: type:I,P,B,代表I,P,B帧视频裸流转换
ffmpeg -f rawvideo -pix_fmt xxx -s wxh -i input.bin -f rawvideo -pix_fmt xxxx -s wxh output.bin eg: ffmpeg -f rawvideo -pix_fmt argb-s 1920x1080 -i input.bin -f rawvideo -pix_fmt yuyv422 -s 1280x720 output.bin 将 argb格式的1080p的input.bin,转换为yuyv格式的720p的output.bin 说明: 将裸流input转换为output,例如将YUV的裸流转化为RGB的裸流视频编码参数设置
ffmpeg -i input -c:v libx264 -profile:v main -preset:v fast -level 3.1 -x264opts crf=18 编码效率和视频质量的取舍: 强行配置biterate,或者强行配置profile/level,还有2个参数可以控制编码效率。 一个是preset,一个是crf。preset也挺粗暴,基本原则就是,如果你觉得编码太快或太慢了,想改改,可以用profile。 preset有如下参数可用: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow and placebo. 编码加快,意味着信息丢失越严重,输出图像质量越差。 CRF(Constant Rate Factor): 范围 0-51: 0是编码毫无丢失信息, 23 is 默认, 51 是最差的情况。相对合理的区间是18-28. 值越大,压缩效率越高,但也意味着信息丢失越严重,输出图像质量越差raw视频多帧转换
ffmpeg -f rawvideo -s wxh -pix_fmt fmt -i input out_%00d.bmp 将输入rawvideo(一般是多帧yuv格式的图片)文件的每一帧转化为bmp,也可以转化为pngffmpeg分离RGB中的rgb分量
FFmpeg filter过滤器使用详解
输出三个拷贝
ffmpeg -i input.rgb -filter_complex "split=3[r][g][b]" \ -map [r] red_channel.png -map [g] green_channel.png -map [b] blue_channel.pngffmpeg -i input.png -filter_complex \ "[0:v]split[r][g][b];[r]palettegen=stats_mode=single[palette];[palette][g][b]paletteuse" extracted_r.pngffmpeg命令行基操(一)-filter_complex
ffmpeg -i 广西.png -filter_complex "[0:v]split=3[tmp1][tmp2][tmp3];\ [tmp2]crop=iw:ih/2:0:0,hflip[flip2];\ [tmp3]crop=iw:ih/2:0:0,vflip[flip3];\ [tmp1][flip2]overlay=0:0[overlay1];\ [overlay1][flip3]overlay=0:H/2" 3.png引号中,有多个线性链,同一条用逗号分开,不同的用分号分开
[0:v]split=3[tmp1][tmp2][tmp3]表示把输入源也就是广西.png复制输出三份,每一份名称依次是[tmp1][tmp2][tmp3].
这个时候我们有[tmp1][tmp2][tmp3]三分图像,再看[tmp2]crop=iw:ih/2:0:0,hflip[flip2], 这个指的是输入是[tmp2]这个图像,经过crop即剪切,剪切位置是0,0处开始,剪切的长度高度是iw:ih/2,然后经过hflip即水平翻转输出[flip2].
[tmp3]crop=iw:ih/2:0:0,vflip[flip3]效果和[tmp2]crop=iw:ih/2:0:0,hflip[flip2]差不多,只不过是裁剪后的图像的翻转方式从水平变成了垂直翻转.
然后就是[tmp1][flip2]overlay=0:0[overlay1],在此之前,我们的[tmp1]这份图像是没有修改过的,所以这段的作用是在tmp1的0,0位置把flip2粘贴上去,然后输出overlay1
最后是[overlay1][flip3]overlay=0:H/2,一样是粘贴,只不过位置变成了0,h/2
最后输出3.png图像保存下来