Linux下使用ffmpeg对视频截图

一、安装ffmpeg

  • 1.下载ffmpeg包
wget http://www.ffmpeg.org/releases/ffmpeg-3.3.tar.bz2
  • 2.解压到指定目录

wget默认是在/root目录下

tar   -jxvf /root/ffmpeg-3.3.tar.bz2 -C /usr
  • 3.前往解压好的目录下编译
cd /usr/ffmpeg-3.3./configuremake (这个步骤可能会很慢 耐心等待)
make install若./configure出现
yasm/nasm not found or too old. Use –disable-yasm for a crippled build.
If you think configure made a mistake, make sure you are using the latest
version from Git. If the latest version fails, report the problem to the
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
Include the log file “config.log” produced by configure as this will help
solve the problem.则执行第四步,执行完后再回来执行此步骤
  • 4.下载最新yasm
http://yasm.tortall.net/Download.html(我下载的是1.2.0版本)解压
tar -zxvf /root/yasm-1.2.0.tar.gz -C /usr 编译(完成后返回执行第三步)
cd /usr/yasm-1.2.0
./configure
make
make install
  • 5.查看ffmpeg是否安装成功
输入ffmpeg命令,出现以下信息则表示安装成功:ffmpeg version 3.3 Copyright (c) 2000-2017 the FFmpeg developersbuilt with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-17)configuration:libavutil      55. 58.100 / 55. 58.100libavcodec     57. 89.100 / 57. 89.100libavformat    57. 71.100 / 57. 71.100libavdevice    57.  6.100 / 57.  6.100libavfilter     6. 82.100 /  6. 82.100libswscale      4.  6.100 /  4.  6.100libswresample   2.  7.100 /  2.  7.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...Use -h to get full help or, even better, run 'man ffmpeg'

二、java实现类

  • 1.编写ffmpeg.sh文件,代码如下:
#!/bin/bash
ffmpeg -i $1 -ss $2 -vframes 1 -r 1 -ac 1 -ab 2 -s 320*180 -f  image2 $3
-i 输入参数
-ss 从多少秒开始
-s 分辨率
-f 导出格式
$1 $2 $3 分别为:源视频地址、开始时间、图片保存地址
  • 2.测试ffmpeg.sh文件是否有效

我的ffmpeg.sh文件保存在/usr目录下,后面的几个是参数

sh /usr/ffmpeg.sh /usr/test.mp4 5 /usr/test.jpg

查看/usr下是否有test.jpg文件,然后查看图片是否为视频的第5秒画面

  • 3.java代码
    调用getVideoSamllImage()时会返回0和1,0表示执行成功,1则表示失败
package com.tes.hsws.web.util;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;public class FfmpegUtil {private final static Log logger = LogFactory.getLog(FfmpegUtil.class);/*** 截取视频的某一帧为视频展示图* @param videoRealPath 视频地址* @param imageRealPath 图片保存地址* @return*/public  int getVideoSamllImage(){int i =0;//截图开始时间int date=0;//批处理文件地址String shPath="/usr/ffmpeg.sh";//视频文件String videoRealPath = "/usr/test.mp4";//截图的路径(输出路径)String imageRealPath ="/usr/test.jpg";//获取视频时间长度ffmpeg命令String exePath="ffmpeg";try {//视频总时长int time=getVideoTime(videoRealPath,exePath);if(time>=30){date=30; //大于30秒 取第30秒}else{date=time/2;//小于30秒 取总时长/2}//调用批处理命令Process ps = null;ps=Runtime.getRuntime().exec("sh "+shPath+" "+ videoRealPath +" "+date+" " + imageRealPath);ps.waitFor();i = ps.exitValue();} catch (IOException | InterruptedException e) {logger.error("视频"+videoRealPath+"截取图片失败");e.printStackTrace();}return i;}/***获取视频总时长* @param video_path 视频地址* @param ffmpeg_path ffmpeg地址* @return*/public static  int getVideoTime(String video_path, String ffmpeg_path) {List<String> commands = new java.util.ArrayList<String>();int time=0;commands.add(ffmpeg_path);commands.add("-i");commands.add(video_path);try {ProcessBuilder builder = new ProcessBuilder();builder.command(commands);final Process p = builder.start();//从输入流中读取视频信息BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));StringBuffer sb = new StringBuffer();String line = "";while ((line = br.readLine()) != null) {sb.append(line);}br.close();//从视频信息中解析时长String regexDuration = "Duration: (.*?), start: (.*?), bitrate: (\\d*) kb\\/s";Pattern pattern = Pattern.compile(regexDuration);Matcher m = pattern.matcher(sb.toString());if (m.find()) {time = getTimelen(m.group(1));System.out.println(video_path+",视频时长:"+time+", 开始时间:"+m.group(2)+",比特率:"+m.group(3)+"kb/s");return time;}} catch (Exception e) {e.printStackTrace();}return time;}/*** 将时间转换为秒* @param timelen* @return*/private static int getTimelen(String timelen){int min=0;String strs[] = timelen.split(":");if (strs[0].compareTo("0") > 0) {min+=Integer.valueOf(strs[0])*60*60;//秒}if(strs[1].compareTo("0")>0){min+=Integer.valueOf(strs[1])*60;}if(strs[2].compareTo("0")>0){min+=Math.round(Float.valueOf(strs[2]));}return min;}
}

linux下ffmpeg命令参考
linux下ffmpeg安装借鉴

第一次写博客,写的不好的地方还希望大家海涵~

Linux下使用ffmpeg对视频截图相关推荐

  1. 嵌入式Linux下基于FFmpeg的视频硬件编解码

    嵌入式Linux下基于FFmpeg的视频硬件编解码[图] http://www.c114.net ( 2012/3/1 15:41 ) 摘要: 对FFmpeg多媒体解决方案中的视频编解码流程进行研究. ...

  2. 嵌入式Linux下基于FFmpeg的视频硬件编解码[图]

    转自:http://tech.c114.net/167/a674033.html 摘要: 对FFmpeg多媒体解决方案中的视频编解码流程进行研究.结合对S3C6410处理器视频硬件编解码方法的分析,阐 ...

  3. linux下使用FFmpeg搭建视频推流拉流测试

    1.概述 公司内部用的是rtmp推流,前端页面展示用webrtc方式拉流展示,基于srs构建的视频体系.之前不是负责视频模块的,为了更熟悉项目,自己大概有了个概念之后,先选取用ffmpeg方式构建一个 ...

  4. Linux下用FFMPEG采集usb摄像头到RTMP

    Linux下用 FFMPEG 采集 usb摄像头视频 和 摄像头内置麦克风音频 到RTMP服务 ffmpeg -f video4linux2 -qscale 10 -r 12 -s 640x480 - ...

  5. Linux下基于qt的视频监控系统

    目录 一.原始需求 二.环境安装 2.1 qt安装 2.2 opencv安装 三.系统设计 3.1. 整体流程设计 3.2 .数据传输交互流程 3.3 .数据库设计 四.关键代码 4.1.如何实现通信 ...

  6. Linux下基于ffmpeg音视频解码

    Linux下基于ffmpeg音视频解码 1.ffmpeg简介   FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以 ...

  7. 嵌入式linux下的FFmpeg交叉编译(最全面)

    FFmpeg介绍 当下直播应用很火,在音视频领域,FFmpeg相当知名.可能你用的一些视频播放器背后都有它的身影.FFmpeg是一个开源的跨平台多媒体处理工具,可以用于处理音视频流.转码.封装.解封装 ...

  8. linux编译ffmpeg.exe,linux下编译FFmpeg

    linux下编译FFmpeg 2020年01月11日 阅读数:12 这篇文章主要向大家介绍linux下编译FFmpeg,主要内容包括基础应用.实用技巧.原理机制等方面,希望对大家有所帮助. 1.首先获 ...

  9. Linux 下播放音乐和视频

    ##Linux 下播放音乐和视频 ###播放音乐-CMUS 使用方式像Vim ######安装播放器 sudo apt-get install cmus ######打开播放器 cmus ###### ...

  10. linux下执行ffmpeg报错无法操作https资源的问题https protocol not found, recompile FFmpeg with openssl, gnutls

    linux下执行ffmpeg报错无法操作https资源的问题https protocol not found, recompile FFmpeg with openssl, gnutls 报错 解决 ...

最新文章

  1. 看看Spring的源码(一)——Bean加载过程
  2. 通过WebService调用SQLXML(SQL Server 2005) [ZT]
  3. Git学习笔记07-删除文件
  4. 【NOIP2012模拟10.25】旅行
  5. OREILLY Programming .NET 3.5 读书笔记之一
  6. 基于Warshall算法的连通图及欧拉图判定方法
  7. Linux文件系统命令 cat
  8. Fiori Elements - list report.xml layout and fragment xml load
  9. java创建对象的几种方式
  10. EnableViewState
  11. [工具]实现文件夹和文件名称批量修改
  12. Linux实验四:文件的压缩
  13. 计算机无法连接网络打印机,网络打印机无法连接的解决方法是什么
  14. 常用SQL_数据库查询总结1
  15. rtx3050参数 rtx3050相当于gtx什么显卡 rtx3050显卡什么水平
  16. 正在准备面试?快手三面面试真题,搞懂这些直接来阿里入职
  17. 180701 icon文件查找与转换网站
  18. 采用Tagged Pointer的字符串
  19. ZUCC_计算机网络实验_实验01 实验一RJ45原理与制作
  20. 自由地思考——保护思想环境

热门文章

  1. 解决“ValueError: Stop argument for islice() must be None or an integer: 0 <= x <= sys.maxsize.”
  2. NO.5 计算数组中三个数的最大乘积
  3. 05-1_部署 master 节点
  4. 23.3.3 Web存储机制【JavaScript高级程序设计第三版】
  5. 理解list和vector的区别
  6. vue实现一个移动端屏蔽滑动的遮罩层
  7. liblinear参数及使用方法(原创)
  8. GROUP BY中ROLLUP/CUBE/GROUPING/GROUPING SETS使用示例
  9. addEventListener 简析
  10. cvCreateTrackbar() 添加滚动条调节参数