苏苏的博客

简约至极

ffmpeg安装使用

下载官方的静态编译的Linux通用二进制包,同时也包含ARM版本的

下载编译好的git最新版

wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-amd64-static.tar.xz

ffmpeg

armhf比armel硬件要求,树莓派2可用armhf,树莓派1使用armel

Windows版本也提供编译好的下载(也提供MacOs版)

https://ffmpeg.zeranoe.com/builds/

Mac编译好的下载(FFmpeg,FFserver,FFprobe,FFplay)

http://evermeet.cx/ffmpeg/

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

https://jsmpeg.com/perf.html