需求:将视频文件压入zip包,然后上传服务器.服务器对zip解压,使用bat/shell,使用ffmpeg对视频进行封面截取.再使用OSS对视频和封面进行批量上传.最后将信息存入数据库

遇到的问题

1.bat批量截取视频封面

  • 在之前的代码中,遍历视频解压后的目录.通过ProcessBuilder调用bat/shell对某一个视频进行封面截取.然后再上传.这一次更改了方案,直接调用一次bat/shell文件对所有视频截取封面.
  • 很显然想到了要在bat/shell中进行循环.在bat循环中要注意 bat for循环 变量赋值的问题.

bat for循环 变量赋值的问题

  • 预处理机制:批处理读取命令时是按行读取的(另外例如 for 命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。在不启用变量延迟,也不对变量动态捕获其扩展变化时,变量在预处理阶段不作改变
  • setlocal enabledelayedexpansion ,就是启用变量延迟,我们可以形象的认为是启用了“对变量动态捕获扩展变化”。而 ! 括起来的变量,就是要动态捕获扩展的目标变量,如果不需要,可以继续使用 % 括变量。
  • 在调用该类型变量时也应注意,不是使用 %var% 而是使用 !var!
  1. @echo off
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. for /r D:\upload\zip\out\ %%i in (*.mp4) do (
  4. set mp4=%%i
  5. set res=!mp4:~0,-4!_pic.jpg
  6. D:\ffmpeg\bin\ffmpeg.exe -i !mp4! -y -f image2 -t 0.001 !res!)
  7. )

2.ffmpeg存在部分视频截取不到封面问题

  • 在使用ffmpeg的过程中发现存在部分视频截取不到的情况,通过尝试后发现是 -ss参数导致

    原始代码:
  1. ffmpeg.exe -ss 3 -i a.mp4 -y -f image2 -t 0.001 -s 300*240 a_pic.jpg

ss参数表示截取第几秒,存在截取不到的原因之一为视频没有那么长.估计还有其他原因,这里没有深究

3.ffmpeg截取封面图片尺寸大小问题

  • 代码如上. -s 参数后面可以指定所要截取出的图片的大小.移动端使用后反馈图片像素和视频像素存在差别.[需要 封面图片 和 视频像素大小一致] 在尝试后发现如果不加 -s 参数 那么默认生成的图片和视频像素一致.

4.使用ProcessBuilder调用bat/shell导致的进程挂起问题

  • 在普通java程序中使用ProcessBuilder调用bat/shell去截取封面,没有问题.但是在web工程中发现调用bat/shell 后,只会截取第一个视频的封面,然后一直卡着.直到停止web工程.然后bat/shell程序才会继续执行,生成所有的封面图片.从现象可以看出,排除bat/shell脚本问题.一定是程序和bat/shell进行交互的地方卡住了.
  • 问题解决参考博文:http://blog.csdn.net/sj13051180/article/details/47865803

使用Java代码调用shell脚本,执行后会发现Java进程和Shell进程都会挂起,无法结束。

挂起原因

  1. 主进程中调用Runtime.exec会创建一个子进程,用于执行shell脚本。子进程创建后会和主进程分别独立运行。
  2. 因为主进程需要等待脚本执行完成,然后对脚本返回值或输出进行处理,所以这里主进程调用Process.waitfor等待子进程完成。
  3. 通过shell脚本可以看出:子进程执行过程就是不断的打印信息。主进程中可以通过Process.getInputStream和Process.getErrorStream获取并处理。
  4. 这时候子进程不断向主进程发生数据,而主进程调用Process.waitfor后已挂起。当前子进程和主进程之间的缓冲区塞满后,子进程不能继续写数据,然后也会挂起。
  5. 这样子进程等待主进程读取数据,主进程等待子进程结束,两个进程相互等待,最终导致死锁。

解决方法

  • 基于上述分析,只要主进程在waitfor之前,能不断处理缓冲区中的数据就可以。因为,我们可以再waitfor之前,单独启两个额外的线程,分别用于处理InputStream和ErrorStream就可以。

使用ffmpeg截取视频封面并批量上传的更多相关文章

  1. php ffmpeg截取视频第一帧保存为图片的方法

    php ffmpeg截取视频第一帧保存为图片的方法 <pre> $xiangmupath = $this->getxiangmupath(); $filename = 'chengs ...

  2. Puppeteer自动化批量上传抖音视频

    前言:最近因为项目宣传,所以用Puppeteer写了一个批量上传抖音视频的自动化程序用于推广. 环境和依赖:node,puppeteer 废话不多说,直接上代码: const puppeteer =r ...

  3. summernote富文本图片上传,增加视频上传功能、批量上传方法

    Summernote 是一个简单灵活的所见即所得的 HTML 在线编辑器,基于 jQuery 和 Bootstrap 构建,支持快捷键操作,提供大量可定制的选项. 但是却只有图片上传功能,没有视频上传 ...

  4. ux.plup.File plupload 集成 ux.plup.FileLis 批量上传预览

    //plupload 集成 Ext.define('ux.plup.File', { extend: 'Ext.form.field.Text', xtype: 'plupFile', alias: ...

  5. 使用WebUploader实现文件批量上传,进度条显示功能

    知识点:利用WebUploader,实现文件批量上传,并且实时显示文件的上传进度 参考官方文档:http://fex.baidu.com/webuploader/ (1)引入三个资源 JS,CSS,S ...

  6. xutils3批量上传文件

    前几天开发安卓要用到文件批量上传,就是上传图片,视频,文件之类的用到Xutil3框架,用 RequestParams params = new RequestParams(url); params.a ...

  7. 带进度条的文件批量上传插件uploadify

    有时项目中需要一个文件批量上传功能时,个人认为uploadify是快速简便的解决方案. 先上效果图: 一. 下载uploadify 从官网下载uploadify的Flash版本(Flash版本免费,另 ...

  8. Discuz模拟批量上传附件发帖

    简介 对于很多用discuz做资源下载站来说,一个个上传附件,发帖是很繁琐的过程.如果需要批量上传附件发帖,就需要去模拟discuz 上传附件的流程. 模拟上传 discuz 附件逻辑 dz附件储存在 ...

  9. Mvc利用淘宝Kissy uploader实现图片批量上传附带瀑布流的照片墙

    前言 KISSY 是由阿里集团前端工程师们发起创建的一个开源 JS 框架.它具备模块化.高扩展性.组件齐全,接口一致.自主开发.适合多种应用场景等特性.本人在一次项目中层使用这个uploader组件. ...

随机推荐

  1. BZOJ 1876 [SDOI2009] SuperGcd | PY好题

    题面就是让你求两个超级大整数,求GCD 题解: 题目本意应该是出题人想考考高精度取膜 但是可以通过一种神奇的Stein算法来做 由J. Stein 1961年提出的Stein算法很好的解决了欧几里德算 ...

  2. 【POJ 2976 Dropping tests】

    Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 13849Accepted: 4851 Description In a certa ...

  3. Vue组件中的单项数据流

    当子组件中的input v-model 父组件的值时不能直接绑定props的值要使用计算属性,向下面的写法,因为props是单项数据流,子组件不能改变父组件的状态,直接绑定会报错. 还可以这样写:但是 ...

  4. [解决方案]未能找到路径“~\bin\roslyn\csc.exe”的一部分

    我的WebApi项目使用Nuget加载了一些包以后出现了这样的问题,本地可以访问,但发布到线上后,出现这样的报错 这个问题出现的原因是Nuget的时候,多加载了一些项目可能不需要的依赖库所导致的. 解 ...

  5. Codeforces Round #357 (Div. 2) B

    B. Economy Game time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  6. jquerydom对象和字符串之间的转换

    字符串转jquery对象:var tmp = $('<div>dd</div>').attr('id','bbq'); //用$符包裹起来即可 jquery对象转字符串: tm ...

  7. 搜索水题四连发_C++

    特别声明:以下题目有部分为原创题,涉及版权问题,不得转载,违者追究 法律责任! 话说这是一套神题,只有你想不到,没有你做不到 题目更正后比 Pascal 跑得还快哈~ 一道特别裸,但是特别坑的搜索题 ...

  8. linux0.11内核源码剖析:第一篇 内存管理、memory.c【转】

    转自:http://www.cnblogs.com/v-July-v/archive/2011/01/06/1983695.html linux0.11内核源码剖析第一篇:memory.c July  ...

  9. 有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台阶走完?

    有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台阶走完? 相关问题: (1)有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台 ...

  10. 我从16ASPX上下了一个程序在运行时出错是怎么回事?运行时出现用户SA登陆失败,但是我已经把数据库导入SQL

    如果你账号密码正确,那你可能没有打开你的管线服务,或者没有配置好你的客户端