一、web端
借助浏览器的webrtc功能获取视频流,然后进行base64转码发往服务端
二、服务端
2.1首先保存为文件,保存到本地
2.2借助于ffmpeg提取音频和视频信息
-c:指定编码器 -c copy:直接复制,不经过重新编码(这样比较快) -c:v:指定视频编码器 -c:a:指定音频编码器 -i:指定输入文件 -an:去除音频流 -vn: 去除视频流 -preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。 -y:不经过确认,输出时直接覆盖同名文件 ffmpeg -i test2.webm -vn -vcodec copy test2.m4a ffmpeg -i test.mp4 -f mp3 -vn -c copy test.mp3 复制代码
2.3利用opencv的VideoWriter生成视频流功能对视频的每帧进行处理(例如对视频流的每帧图片进行人脸检测)
VideoCapture capture=new VideoCapture(); capture.open(targetPath);//1 读取视频文件的路径 Size size = new Size(capture.get(Videoio.CAP_PROP_FRAME_WIDTH), capture.get(Videoio.CAP_PROP_FRAME_HEIGHT)); VideoWriter vw=new VideoWriter(catalogue+fileName+"1"+type, VideoWriter.fourcc('V', 'P', '0', '9'), //capture.get(Videoio.CAP_PROP_FPS), 30, size, true); if(!capture.isOpened()){ logger.info("读取视频文件失败!"); return null; } Mat video=new Mat(); int i=0; long starTime=System.currentTimeMillis(); while (capture.isOpened() && capture.read(video)) { logger.info("当前" + (i++)); //对每帧的图片进行处理 Mat current = ImageUtil.getVideoFace(video); if(null==current) { break; } vw.write(current); } capture.release(); vw.release(); 复制代码
2.4最后对重新生成的视频和上面提取的音频进行合成
ffmpeg -i test2.wav -i test21.avi test22.webm 复制代码
2.5得到了处理过的视频信息推送给对方用户