打烊~~ 2021-07-22 10:42 采纳率: 0%
浏览 261
已结题

ffmpeg录制视频时,由于视频尾部截取不当,而导致没有视频时长问题。

个人采用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、开始录制视频
img
2、终止录制视频

img

  • 写回答

1条回答 默认 最新

  • 打烊~~ 2021-07-23 10:45
    关注

    两种解决方式
    1、通过信号处理的方式写一个对视频进行每秒爆粗的命令,但是这个我不太清楚,所以没采用。
    2、将录制的视频进行转码操作,视频的尾部处理不当是因为将子进程销毁而导致的,并非是因为视频录制不当导致的,因此重新转码即可解决本问题。这里将录制的flv转为mp4格式。" ffmpeg -i "+旧的视频位置+" -vcodec copy -f mp4 "+新的视频位置。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 7月31日
  • 已采纳回答 7月23日
  • 创建了问题 7月22日

悬赏问题

  • ¥15 paddleocr运行报错
  • ¥15 怎么用 matlab 设计滞后-超前串联校正网络
  • ¥15 MFC引用C#生成的dll,将dll放置到非exe程序目录,如何操作
  • ¥15 C#创建webservice接口,三方通过多次跳转访问本方服务,获取wsdl文档,wsdl中ip地址为局域网内本机地址而非三方直接访问的地址。
  • ¥15 关于#wireshark#的问题:需要安卓app流量数据集要安卓流量做包序列长度的实验,比如某些流量是在看视频还是在发评论
  • ¥15 Smail语句如何使用判断语句跳过验证卡密界面
  • ¥15 关于#wireshark#的问题:并且能够给数据做标注,如这个流量是在看视频或者是在转账
  • ¥15 运筹优化,gurobi,python
  • ¥20 springmvc重定向和返回json
  • ¥15 电脑键盘实现触摸功能