个人采用Java语言,通过Runtime.getRuntime().exec()开启一个子进程,执行ffmpeg的录像命令,命令为:ffmpeg -i 视频流地址 -c copy -f segment -strftime 1 -segment_time 20 视频保存的位置\1_20210722101044.flv 。
当用户选择录像时,调用该命令,选择结束录像时,调用Runtime.getRuntime().exec()返回的process对象的destroy()方法结束进程。但由于该方法直接销毁进程,因此导致视频的尾部有问题。
1、在解决过程中,我尝试调用process对象的waitFor()方法,暂停进程,但由于waitFor()方法在未完成任务时处于阻塞状态,我的视频流地址又是从线上直接拉取的,线上视频一直处于推流状态,因此导致该方法一直处于等待状态。
2、考虑到等待问题,我再调用waitFor()方法之前,获取process对象的输入、输出流,进行关闭操作,但该操作似乎不能对子进程进行断流,因此并没有什么效果。
目前考虑采用ffmpeg的命令,每隔一秒保存一次视频信息,但我百度了好长时间,没有找到相关命令。
下面是部分代码:
1、开始录制视频
2、终止录制视频