ffmpeg安装使用
下载官方的静态编译的Linux通用二进制包,同时也包含ARM版本的
下载编译好的git最新版
wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-amd64-static.tar.xz
armhf比armel硬件要求,树莓派2可用armhf,树莓派1使用armel
Windows版本也提供编译好的下载(也提供MacOs版)
https://ffmpeg.zeranoe.com/builds/
Mac编译好的下载(FFmpeg,FFserver,FFprobe,FFplay)
https://www.npmjs.com/package/ffmpeg-static#sources-of-the-binaries
使用brew安装
brew install ffmpeg --with-ffplay
ffmpeg -protocols
查看ffmpeg支持的协议列表
让ffmpeg转为MP4边下边播
ffmpeg -i input.xx -c copy -movflags faststart output.mp4
-movflags faststart
可修改MP4的moov
关于faststart
还有一个python项目,类似于ffmpeg软件包中的qt-faststart
https://github.com/danielgtaylor/qtfaststart
可以使用pip install qtfaststart
,仅需10KB+
pip3 install qtfaststart
也可以
http://blog.chinaunix.net/uid-342902-id-2416123.html
转成 dash 特殊的mp4
ffmpeg –i input.flv –c copy –f mp4 –movflags dash output.mp4
flv to mp4
ffmpeg -i input.flv -codec copy output.mp4
快速转化flv到mp4,高质量转化( only changes container without reencoding )
ffmpeg -i input.flv -c copy -copyts output.mp4
也比较快,高质量转化
ffmpeg -i aaa.flv -c:v libx264 -crf 28 output.mp4
带压缩的转换,非常消耗CPU和时间
更多用法可以参考 http://www.jianshu.com/p/053665062f22
mp4 to gif
http://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html#usage
/tmp/1.sh
#!/bin/sh
palette="/tmp/palette.png"
filters="fps=15,scale=360:-1:flags=lanczos"
ffmpeg -v warning -i $1 -vf "$filters,palettegen" -y $palette
ffmpeg -v warning -i $1 -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y $2
使用: /tmp/1.sh file.mp4 file.gif
视频裁剪
ffmpeg -i ./plutopr.mp4 -vcodec copy -acodec copy -ss 00:00:10 -to 00:00:15 ./cutout1.mp4 -y
-ss time_off set the start time offset 设置从视频的哪个时间点开始截取,上文从视频的第10s开始截取 -to 截到视频的哪个时间点结束。上文到视频的第15s结束。截出的视频共5s. 如果用-t 表示截取多长的时间如 上文-to 换位-t则是截取从视频的第10s开始,截取15s时长的视频。即截出来的视频共15s.
注意的地方是: 如果将-ss放在-i ./plutopr.mp4后面则-to的作用就没了,跟-t一样的效果了,变成了截取多长视频。一定要注意-ss的位置。
参数解析 -vcodec copy表示使用跟原视频一样的视频编解码器。 -acodec copy表示使用跟原视频一样的音频编解码器。
-i 表示源视频文件 -y 表示如果输出文件已存在则覆盖。
处理m3u8地址视频
ffmpeg -threads 2 -i "m3u8地址" -c copy -movflags +faststart 文件名.MP4
-threads 2表示使用的线程数,这里设置为2线程,可以根据自己服务器的性能进行设定,也可以不设定默认为单线程。 -i “m3u8地址"表示输入地址,其中m3u8既可以是网络地址也可以是本地视频路径。 -c copy表示不进行转码,直接复制m3u8地址中的音视频流。 -movflags +faststart表示将moov box移动到文件的头部,以便于快速播放。 文件名.MP4表示输出的文件格式,其中MP4可以替换成mkv、ts等支持的视频封装格式。
ffmpeg -threads 2 -i "m3u8地址" -c copy -map 0 -f segment -segment_list 生成新m3u8地址索引名.m3u8 -segment_time 900 新文件名%03d.ts
-map 0 -f segment -segment_list 生成新m3u8地址索引名.m3u8 -segment_time 900表示切片分割参数,缺一不可。 -segment_time 900表示每900秒进行一次分割切片,时间可根据需要自行设置。 新文件名%03d.ts表示生成新的切片文件,其中%03d.ts必不可少。
下载转码 ffmpeg -i "http://m3u8的地址" -c copy -bsf:a aac_adtstoasc output.mp4
ffmpeg -i http://xxx.m3u8 "文件名.mp4"
转化为mp4,需要直到结束,一个文件才能完整,才能写入其moov
,其moov
数据始终是在mdat
之后,我们需要使用qtfaststart
才能使其适合边下边播
我们可以使其转化为flv文件,这样视频不用完整就能播放,可以边转码边播放。
ffmpeg -i “http://xxx.m3u8” -b 8M -r 12 -g 12 output1.flv
ffmpeg -i "http://xxx.m3u8" -b 2M out.flv
ffmpeg -i xx.rmvb -c:a copy -movflags faststart output.mp4
ffmpeg 大文件转换为mp4速度很慢通常低配机器是0.5X倍速, 可以转换为flv文件,转换为flv相比转换为mp4速度快很多,一般能3X倍速,还能边转换,边播放
转换为flv,需要设置码率高一些,不然视频画面,严重模糊,设置比特率高些不很影响转码速度
使用-b
设置比特率(码率),默认为200Kbit/s,这里改为2048
-r
设定视屏帧率 即 fps
ffmpeg -i xx.rmvb -b 2M a.flv
2M 适用于1280X720 普通清晰度. 如果分辨率更大需调整4M 或 6M
ffmpeg 合并 MP4文件
ffmpeg-sound.txt
file 1.mp4
file 2.mp4
file 3.mp4
file 4.mp4
ffmpeg -f concat -i ffmpeg-sound.txt -c copy final_output.mp4
批量合并ts文件
使用方式同合并mp4文件,这次我们可以使用命令行参数指定文件,而不需要文件列表.
ffmpeg -i "concat:file001.ts|file002.ts|file003.ts|file004.ts" -acodec copy -vcodec copy -absf aac_adtstoasc out.mp4
假如有很多文件,我们一个个拼接文件列表也很麻烦,可以使用shell快速生成 for i in {1..100};do echo -e "file$i.ts|\c";done;
对于一个文件夹内存在很多要合并的文件,可以使用下面脚本
ls * | perl -nale 'chomp;push @a, $_;END{printf "ffmpeg -i \"concat:%s\" -acodec copy -vcodec copy -absf aac_adtstoasc out.mp4\n", join("|",@a)}'
http://askubuntu.com/questions/352920/fastest-way-to-convert-videos-batch-or-single
https://www.zhouchun.net/blog/show/293
https://www.cnblogs.com/frost-yen/p/5848781.html
-vf 视频过滤器 -af 音频过滤器 用 -r 参数设置帧率 设置码率 –b 参数
音频参数: -ar 设定采样率 -ac 设定声音的Channel数 -acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器 -an 不处理音频
视频参数: -b 设定视频流量,默认为200Kbit/s -r 设定帧速率,默认为25 -s 设定画面的宽与高 -aspect 设定画面的比例 -vn 不处理视频 -vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
http://blog.csdn.net/danielpei1222/article/details/61916435
ffmpeg 截图
ffmpeg -ss 10 -i input.flv -y -f image2 -vframes 100 -s 352x240 b-%03d.jpg
参数解释:
-i 输入文件
-y 覆盖
-f 生成图片格式
-ss 开始截图时间 seconds or in hh:mm:ss[.xxx] 如果截图开始时间越接近篇尾,所花费的时间就会越长
-vframes 截图帧数 或者 使用 -t : 截图时长 seconds, or hh:mm:ss[.xxx]
-s 图片宽高比
b-%3d.jpg 格式化文件命名,会生成 b-001.jpg,b-002.jpg 等。
注意设定长宽高的话,像素比较低
旋转视频
ffmpeg -i intro_app_upload.mp4 -c copy -metadata:s:v:0 rotate=90 last.mp4
裁剪视频
ffmpeg -i example.avi -vf crop=a:b:c:d outputfilename
其中a、b、c、d分别代表的参数是a为输出的宽度,b为输出的高度,c为需要左移的距离,d为序要上移的距离(单位默认为pixel)
c的值如果大于a与原始视频的宽度差,则只移动a与原始视频的宽度差的距离,
d的值如果大于b与原始视频的高度差,则只移动b与原始视频的高度差的距离,
去黑边切去的是画面区域的右侧和下侧。
mpv 播放多个url
直接 mpv url1 url2 url3 url4
就可以连起来播放
mpv
播放URL时,先发送一个Head请求,探测文件大小,
HEAD请求使用的user-agent Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20150101 Firefox/47.0 (Chrome)
随后发送GET请求获取数据,使用的User-Agent: mpv 0.26.0.
mpv会读取文件的moov,mdat等信息,可自动处理不是qt-faststart
的文件但没有Chrome智能,Chrome浏览器播放视频文件时,也有这个能力.
mpv获取数据是单线程的.
mpv 快捷键
shift+T最前端显示
PageUP下一章节
PageDown上一章节
Right前进5秒
Left后退5秒
Up前进10秒
Down后退10秒
RightClick/Space/P暂停播放
f/LeftDoubleClick全屏
ESC退出全屏
q/command+q退出播放器
O显示进度
[]播放速度
w/e好像是剪裁
r/t字幕位置
u字幕样式override
s/ctrl+s截图
d反交错开关Deinterlace
h/k电视频道(没什么用)
J切换字幕
L某一段重复播放(鬼畜)
Z/X字幕延迟
v隐藏显示字幕
M静音
<逐帧播放
>按下播放,回弹暂停
1对比度-
2对比度+
3亮度-
4亮度+
5伽马-
6伽马+
7饱和度-
8饱和度+
9、/减小音量
0、*增大音量
mpv播放显示
(+) Video --vid=1 (*) (mpeg4 25.000fps)
(+) Audio --aid=1 --alang=eng (*) (aac 2ch 44100Hz)
AO: [coreaudio] 44100Hz stereo 2ch floatp
VO: [opengl] 1920x1080 yuv420p
Chrome,Firefox 浏览器播放只有声音没有图像,只有safari可以播放mpeg4
使用ffmpeg处理视屏编码,使用h264编码格式 ffmpeg -i xxx.mp4 -c:v libx264 -movflags faststart out.mp4
耗时2:05
ffmpeg -i input.rmvb -c:v libx264 -preset veryfast -crf 18 -c:a copy -movflags faststart output.mp4
编码速度更快,但体积大一下
压缩以缩小体积
18~28
是一个合理的范围。18被认为是视觉无损的从技术角度上看当然还是有损的
它的输出视频质量和输入视频相当
ffmpeg -i bigfile.mp4 -c:v libx264 -s 800x450 -b:v 800k -ar 44100 -ab 48k -preset slower -crf 19 -movflags faststart output.mp4
http://blog.csdn.net/happydeer/article/details/52610060
编码后可以播放,并且比mpeg4编码的体积更小
(+) Video --vid=1 (*) (h264 1920x1080 25.000fps)
(+) Audio --aid=1 --alang=eng (*) (aac 2ch 44100Hz)
AO: [coreaudio] 44100Hz stereo 2ch floatp
VO: [opengl] 1920x1080 yuv420p
ffmpeg -i 1-2.mp4 -c:v libx264 -preset veryslow -crf 18 -c:a copy -movflags faststart ../1-2.mp4
ffmpeg -i 12.mp4 -c:v libx264 -s 1280x720 -b:v 8M -ar 48000 -ab 128k -preset faster -crf 19 -movflags faststart out.mp4
为取得更小的视频,可以使用两步压缩
ffmpeg -y -i jgdq.mp4 -c:v libx264 -b:v 2000k -pass 1 -an -f mp4 /dev/null && ffmpeg -i jgdq.mp4 -c:v libx264 -b:v 2000k -pass 2 -c:a aac -b:a 128k output.mp4
https://trac.ffmpeg.org/wiki/Encode/H.264
将一个高清流,复制为几个不同视频清晰度的流重新发布,其中音频不变 ffmpeg -re -i rtmp://server/live/high_FMLE_stream -acodec copy -vcodec x264lib -s 640×360 -b 500k -vpre medium -vpre baseline rtmp://server/live/baseline_500k -acodec copy -vcodec x264lib -s 480×272 -b 300k -vpre medium -vpre baseline rtmp://server/live/baseline_300k -acodec copy -vcodec x264lib -s 320×200 -b 150k -vpre medium -vpre baseline rtmp://server/live/baseline_150k -acodec libfaac -vn -ab 48k rtmp://server/live/audio_only_AAC_48k
视频合并
https://stackoverflow.com/questions/7333232/how-to-concatenate-two-mp4-files-using-ffmpeg
ffmpeg -i “concat:00000.MTS|00001.MTS|00002.MTS|00003.MTS|00004.MTS|00005.MTS|00006.MTS|00007.MTS|00008.MTS|00009.MTS|00010.MTS|00011.MTS|00012.MTS|00013.MTS|00014.MTS|00015.MTS” -c:v libx264 -crf 20 -preset medium -c:a aac -b:a 128k
-movflags +faststart -vf scale=-2:720,format=yuv420p output.mp4
ffmpeg macOs 摄像头
列出可用设备
ffmpeg -f avfoundation -list_devices true -i ""
ffmpeg -f avfoundation -framerate 30 -i "0" -target pal-vcd test.mpg
ffmpeg -f avfoundation -framerate 30 -i "0" test.mp4
屏幕录制
ffmpeg -f avfoundation -i "1" -pix_fmt yuv420p -r 25 -t 5 out.mov
如果希望将桌面录制或者分享,可以使用命令行如下:
ffmpeg -f avfoundation -i "1" -vcodec libx264 -preset ultrafast -acodec libfaac -f flv rtmp://192.168.1.105:1935/live1/room1
如果需要桌面+麦克风,比如一般做远程教育分享ppt或者桌面,有音频讲解 命令行如下:
ffmpeg -f avfoundation -i "1:0" -vcodec libx264 -preset ultrafast -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://192.168.1.105:1935/live1/room1
如果需要桌面+麦克风,并且还要摄像头拍摄到自己,比如一般用于互动主播,游戏主播,命令行如下
ffmpeg -f avfoundation -framerate 30 -i "1:0" \
-f avfoundation -framerate 30 -video_size 640x480 -i "0" \
-c:v libx264 -preset ultrafast \
-filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://192.168.1.105:1935/live1/room1
ffmpeg -re -i ~/Downloads/526.mp4 \
-f flv -c:v libx264 -preset veryfast -tune zerolatency -crf 20 -c:a copy "rtmp://video.xx.cn/tuwenzb/twv1_331001?auth_key=1590748713-8cdb1a4b800d46b58c3fb820448a0687-0-d4c1fc048a225b5c2daf6f66076eb9c3"
ffmpeg -re -i 1.mp4 -vcodec copy -acodec copy -f flv “rtmp://”
https://phoboslab.org/log/2013/09/html5-live-video-streaming-via-websockets