mp4转m3u8
微信h5(单页应用)不缓存html,缓存js,css等资源
需求场景
在单页应用中,只有一个html页面,网站的大部分css,js等资源引用都写在这个html中,当更新css,js的随机数然后发布时,由于客户端缓存了html,并不能及时更新。
解决方案
location / {
try_files $uri $uri/ /index.html;
if ($uri ~* .*\.(?:htm|html)$) {
add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
}
if ($uri ~* .*\.(?:js|css|jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm)$) {
expires 7d;
}
}
微信环境解决方案
微信环境中html的缓存也是一直遭人诟病的。在普通浏览器中,只需要将html后面也加一个随机数,就可以不缓存html,或者在meta标签中添加标识,又或者如上的nginx配置。而在微信浏览器中这些方法都是无效的。
if ($uri ~* .*\.(?:htm|html)$) {
add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
add_header Last-Modified $date_gmt;
}
Linux下Tab补全忽略大小写
Ubuntu删除仓库及其 GPG 密钥
树莓派4b实现家庭监控mjpg-streamer
打开树莓派配置的camera开关
可以通过gui界面或者sudo raspi-config
打开,详细方式不再赘述
编译环境
sudo apt-get install cmake libjpeg8-dev
sudo apt-get install gcc g++
编译安装
git clone https://github.com/jacksonliam/mjpg-streamer
cd mjpg-streamer/mjpg-streamer-experimental
make
sudo make install
CSI摄像头启动
cd mjpg-streamer-experimental
./mjpg_streamer -i "input_raspicam.so" -o "output_http.so -w ./www"
#指定端口需要密码访问
#./mjpg_streamer -i "input_raspicam.so" -o "output_http.so -w ./www -p 8282 -c usename:password"
usb摄像头启动
cd mjpg-streamer-experimental
./mjpg_streamer -i "input_uvc.so" -o "output_http.so -w ./www"
根据摄像头实际情况启动,之后就可以在localhost:8080端口看到实时画面了
参 数说明
./mjpg_streamer -i "input_uvc.so --help"
./mjpg_streamer -o "output_http.so --help"
参考文档
后续探索
目前已经可以看到实时画面了,不过作为监控功能还是不太够,比如需要保存视频。在mjpg-streamer的github上可以看到output_file插件可以满足部分需求,详细参数可以通过./mjpg_streamer -o "output_file.so --help
查看,有时候不需要一直保存视频,只是希望出现人的时候再保存视频,在github的pull-requests中有相关的motion_detect插件,不过维护者并没有合并到主分支,有兴趣的大佬可以试试。
开机启动
ios safari无法播放部分mp4视频
需求场景
最近编辑发现部分上传的mp4视频无法在ios下播放,在chrome上是正常的。通过搜索一般都是说chrome和safari中request header的"range"字段不同,给出的解决方案都是基于后端语言的,而我们的视频都是直接放在nginx上的,并没有经过后段语言处理。实际情况是部分mp4能正常播放,部分mp4不行,更大的可能性在于mp4本身的问题。
解决方案
通过ffmpeg查看能播放的mp4和不能播放的mp4的视频信息ffprobe test.mp4
,两者相比较,可以发现两者有个参数不同,一个是yuv420p,一个是yuv444p,能播放的是yuv420p,不能播放的是yuv444p,通过格式工厂等工具将mp4重新转格式之后,确实可以播放了。
后续探索
可是为什么yuv420p是可以的yuv444p是不行的,safari是不兼容yuv444p么?后来通过搜索,终于发现国外的一位的老哥,也遇到同样的问题,并给出了ffmpeg下yuv444p转yuv420p的方案。ffmpeg -i a.mp4 -vcodec libx264 -acodec copy -vprofile main -pix_fmt yuv420p a-new.mp4
详见video not playing on Android (chrome) and iOS (safari)
yuv444p转yuv420p
ffmpeg -i [input file] -c:v libx264 -pix_fmt yuv420p [output file]
详见FFMPEG Convert YUV444p to YUV420p
基于ffmpeg的批量转mp4命令行工具
基于ffmpeg的GUI工具
ffmpegGUI, 作者没有提供打包的文件,需要自行编译打包,并且暂不支持批量转换
浏览器兼容最好的mp4要求
h264 yuv420p