public void fileTom3u8(Video video){
//
video.setStatus(2)
videoService.update(video)
String fileName = String.valueOf(System.currentTimeMillis())
String dest = Configue.getUploadUrl()+ UploadUtil.getImagesUpladPath() + fileName + ".m3u8"// 目标文件
// 调用bat文件转换流化视频
String batpath = "cmd /c start " + Configue.getFfmpegPath() + "ffmpeg.exe -i"
// 加参数
batpath += " " + Configue.getUploadUrl() + "/" + video.getPath()
batpath += " -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 "
batpath += " " + Configue.getUploadPath() + UploadUtil.getImagesUpladPath() + fileName + ".m3u8"
CommonUtils.runbat(batpath)
video.setStreamingPath(UploadUtil.getImagesUpladPath() + fileName + ".m3u8")
video.setStatus(1)
videoService.update(video)
System.out.println(batpath)
}
1、下载ffmpeg。2、解压缩 tar -zxvf ffmpeg.tar.gz
3、编辑profile文件:
vi /etc/profile
在文件末尾加上两句话:
export FFMPEG_HOME=/usr/local/ffmpeg
export PATH=$FFMPEG_HOME/bin:$PATH
4、配置安装路径之类的:
./configure --enable-shared --prefix=/usr/local/ffmpeg
--enable-shared 参数据说是允许其编译产生动态库,在以后的编程中要用到这个几个动态库。
如果出现异常,提示因为缺少yasm,需要添加参数,再执行以下命令:
./configure --enable-shared --disable-yasm --prefix=/usr/local/ffmpeg
如果执行结果不对,可以根据提示信息,并查看帮助,解决问题
./configure --help
5、编译安装
make
make install
6、安装之后在/usr/local/ffmpeg会看到有三个目录
bin 执行文件目录
lib 静态,动态链接库目录
include 编程用到的头文件
7、为了防止执行程序找不到库文件,
可以将/usr/local/ffmpeg/lib目录设置到LD_LIBRARY_PATH环境变量
8、若出现error while loading shared libraries: libavdevice.so.52的错误
修改/etc/ld.so.conf 在最后一行加上/usr/local/ffmpeg/lib
ldconfig -v
并修改 /usr/local/ffmpeg/lib目录下的文件权限为777
看什么框架, 什么操作系统了。 一般可以直接system把脚本字符串当做参数处理。 这个方法坏处是会开新进程。 还有一个方法就是把ffmpeg编译进项目(建议把main函数改成一个可调用的函数)可以写一个service, 里面负责调度ffmpeg, 每一个请求开一个新的ffmpeg解码线程。 需要注意的是ffmpeg对内存的需求很高, 所以线程不肯能无限增加。 所以需要自己写一个线程池来维护线程数量。 超过线程数量的请求会被block知道一个线程释放。 这样还是有问题, 因为视频流是长期处理过程, 所以资源有限的情况下是不够处理高并发的。 最后一个方法是用nginx rtmp什么的负责多个视频流的连接, 然后就把不同的视频包都扔到同一个线程队列处理,然后解码分发。这样高并发性能也许会好一点, 缺点是可能会出现所有人都卡顿的情况欢迎分享,转载请注明来源:夏雨云
评论列表(0条)