最近有个事件回放的功能需求:移动端会将所有截图(webp格式)以及操作手势信息(坐标+时间戳)发送到服务端,然后服务端将图片于位置信息进行合成(重新绘图),然后调用ffmpeg工具将图片连接成视频,供web前段播放。以下是主要步骤:
操作员在服务端配置:指定的客户(deviceId,userId),指定事件回放的时间段(t1,t2),这些数据存入Oracle的表RAZOR_EVENT_REPLAY 中手机端启动应用时,访问接口/pushpolicyquery,请求参数为{"appKey":"xxxxxxxxxxx","useridentifier":"xxxxxxxxxxx","deviceid":"xxxxxxxxxxx"} 服务端根据请求的userId或deviceId以及APPkey查询表RAZOR_EVENT_REPLAY、RAZOR_CHANNEL_PRODUCT,若有其事件回放的配置信息,则返回该信息,否则返回空,返回数据:
eventReplayConfigure = [{ "erId" : "1049096" , "erUserId" : "xxx" , "erDeviceId" : "xxxxx" , "erTimeStart" : "2017-01-02 13:08:31" , "erTimeStop" : "2017-01-02 13:08:31" , "erProductId" : "xxx" , "erCreateTime" : "xx" , "erFlag" : "x" } , { "erId" : "xxxxxxx" , "erUserId" : "xxx" , "erDeviceId" : "xxxxx" , "erTimeStart" : "2017-01-02 13:08:31" , "erTimeStop" : "2017-01-02 13:08:31" , "erProductId" : "xxx" , "erCreateTime" : "xx" , "erFlag" : "x" } , .................]
当手机端APP满足一定条件后,获取事件回放的相关数据(图片名:eventReplay_Id+时间 ,比如10029829_1487765797853),并将数据发送至接口/saveEventReplay接口 上传图片数据:attachment=xxxx 上传手势等文本数据:
content={ "data" :[{ "erId" : "1049096" , "data" :{ "motion_x" : "10" , "motion_y" : "10" , "time" : "1487765797853" }} , { "erId" : "1049096" , "data" :{ "motion_x" : "11" , "motion_y" : "12" , "time" : "1487765798100" }} , .......]};服务端保存成功后返回: flag == 1 保存成功
服务端先将图片、操作手势等信息保存至本地,利用ffmpeg将webp格式的图片转化为jpg格式:ffmpeg -i webwxgetmsgimg.webp test.jpg
后期调用jar包获取本地数据,并根据操作手势信息将水印加到图片上,然后再保存至本地 利用linux shell脚本调用第三方软件ffmpeg将图片连接成视频,供web端调用显示 多张图片连接成视频:ffmpeg -r 5 -f image2 -i frames/img_outM.jpg test22.mp4 #每秒5帧图片
6.将第4,5步写为shell 脚本,方便一次调用