博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图片转字符图片(三)
阅读量:7105 次
发布时间:2019-06-28

本文共 5870 字,大约阅读时间需要 19 分钟。

序言

这个是从抖音上学来的,一开始刷抖音,遇到不少字符串跳舞的视频,因此来实践一下

主要分为三个部分

  1. 静态图片转静态图片
  2. gif转gif
  3. 视频转视频

视频转视频

主要用到了FFmpeg这个工具,利用命令对视频文件进行操作。首先根据自己调的参数进行图片的截取(本文的是1秒10帧的参数),图片转换,然后分离音频,最后字符图片和音频合成目标视频。

FFmpeg的代码库:

FFmpeg下载地址:

主要用到的几个命令,其他按帧截图命令参考文末链接4:

// 截图ffmpeg -ss 10 -i input.flv -y -f image2  -vframes 100 -s 352x240 b-%03d.jpg// 分离音频ffmpeg -i 3.mp4 -vn -y -acodec copy 3.aac// 合成视频ffmpeg -threads2 -y -r 10 -i /tmpdir/image%04d.jpg -i audio.mp3 -absf aac_adtstoasc output.mp4

环境:

JDK 1.8

// ffmpeg -ss 10 -i input.flv -y -f image2  -vframes 100 -s 352x240 b-%03d.jpg      /**     * ffmpeg 截图,并指定图片的大小     *      * @param srcVideoPath     * @param tarImagePath     *            截取后图片路径     * @param width     *            截图的宽     * @param hight     *            截图的高     * @param offsetValue     *            表示相对于文件开始处的时间偏移值 可以是分秒     * @param vframes     *            表示截图的桢数     *      * @return     */    public static boolean processFfmpegImage(String srcVideoPath, String tarImagePath, int width, int hight,            float offsetValue, float vframes) {        if (!checkfile(srcVideoPath)) {            System.out.println("【" + srcVideoPath + "】  不存在 !");            // logger.error("【" + srcVideoPath + "】 不存在 !");            return false;        }        List
commend = new java.util.ArrayList
(); commend.add(ffmpegPath); commend.add("-i"); commend.add(srcVideoPath); commend.add("-y"); commend.add("-f"); commend.add("image2"); commend.add("-ss"); commend.add(offsetValue + ""); // 在视频的某个插入时间截图,例子为5秒后 // commend.add("-vframes"); commend.add("-t");// 添加参数"-t",该参数指定持续时间 commend.add(vframes + ""); // 截图的桢数,添加持续时间为1毫秒 commend.add("-s"); commend.add(width + "x" + hight); // 截图的的大小 commend.add(tarImagePath); try { ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); builder.redirectErrorStream(true); // builder.redirectOutput(new File("F:/123/log/log.log")); Process process = builder.start(); doWaitFor(process); process.destroy(); if (!checkfile(tarImagePath)) { System.out.println(tarImagePath + " is not exit! processFfmpegImage 转换不成功 !"); // logger.info(tarImagePath + " is not exit! processFfmpegImage // 转换不成功 !"); return false; } return true; } catch (Exception e) { e.printStackTrace(); System.out.println("【" + srcVideoPath + "】 processFfmpegImage 转换不成功 !"); // logger.error("【" + srcVideoPath + "】 processFfmpegImage 转换不成功 // !"); return false; } } public static boolean processFfmpegAudio(String srcVideoPath, String tarAudioPath) { if (!checkfile(srcVideoPath)) { System.out.println("【" + srcVideoPath + "】 不存在 !"); // logger.error("【" + srcVideoPath + "】 不存在 !"); return false; } // https://blog.csdn.net/xiaocao9903/article/details/53420519 // ffmpeg -i 3.mp4 -vn -y -acodec copy 3.aac // ffmpeg -i 3.mp4 -vn -y -acodec copy 3.m4a List
commend = new java.util.ArrayList
(); commend.add(ffmpegPath); commend.add("-i"); commend.add(srcVideoPath); commend.add("-vn"); commend.add("-y"); commend.add("-acodec"); commend.add("copy"); // 在视频的某个插入时间截图,例子为5秒后 commend.add(tarAudioPath); try { ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); builder.redirectErrorStream(true); Process process = builder.start(); doWaitFor(process); process.destroy(); if (!checkfile(tarAudioPath)) { System.out.println(tarAudioPath + " is not exit! processFfmpegAudio 转换不成功 !"); return false; } return true; } catch (Exception e) { e.printStackTrace(); System.out.println("【" + srcVideoPath + "】 processFfmpegAudio 转换不成功 !"); return false; } } /** * ffmpeg 合成视频 * * @param srcVideoPath * @param tarImagePath * 截取后图片路径 * @param width * 截图的宽 * @param hight * 截图的高 * @param offsetValue * 表示相对于文件开始处的时间偏移值 可以是分秒 * @param vframes * 表示截图的桢数 * * @return */ public static boolean processFfmpegVideo(String imagePath, String audioPath, String tarVideoPath, int step) { // https://blog.csdn.net/wangshuainan/article/details/77914508?fps=1&locationNum=4 // 带音频 // ffmpeg -threads2 -y -r 10 -i /tmpdir/image%04d.jpg -i audio.mp3 -absf // aac_adtstoasc output.mp4 List
commend = new java.util.ArrayList
(); commend.add(ffmpegPath); commend.add("-threads"); commend.add("2"); commend.add("-y"); commend.add("-r"); commend.add(step + ""); commend.add("-i"); commend.add(imagePath); // 图片 commend.add("-i"); commend.add(audioPath); commend.add("-absf");// commend.add("aac_adtstoasc"); // commend.add(tarVideoPath); try { ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); builder.redirectErrorStream(true); builder.redirectOutput(new File("F:/123/log/log.log")); Process process = builder.start(); doWaitFor(process); process.destroy(); if (!checkfile(tarVideoPath)) { System.out.println(tarVideoPath + " is not exit! processFfmpegVideo 转换不成功 !"); return false; } return true; } catch (Exception e) { e.printStackTrace(); System.out.println("【" + tarVideoPath + "】 processFfmpegVideo 转换不成功 !"); return false; } }

源码地址:

参考:

你可能感兴趣的文章
nexus 手册
查看>>
【hadoop】15.HDFS-其他功能
查看>>
照葫芦画瓢-reading files(读文件)
查看>>
HTTP协议详解(转)
查看>>
Android零基础入门第54节:视图切换组件ViewSwitcher
查看>>
083-使用shell和expect一键批量分发SSH密钥脚本
查看>>
线上采购注意了
查看>>
压缩与打包
查看>>
0037-如何在Windows Server2008搭建DNS服务并配置泛域名解析
查看>>
.net core入门之HelloWorld
查看>>
OSChina 周六乱弹 ——给媳妇打电话,一个男人的声音……
查看>>
OSChina 周一乱弹 —— 鱼生不值得
查看>>
jodd mvc框架 madvoc 教程(12):madvoc 杂项
查看>>
ffmpeg转码不同分辨率视频
查看>>
Oracle:查找表的主键,外键,唯一性约束,索引
查看>>
Python学习笔记-模块介绍(二)-模块导入和执行
查看>>
Cocos数据篇[3.4](6) ——SQLite3数据库基础用法
查看>>
Linux应用总结(1):自动删除n天前日志
查看>>
跟我学习dubbo-简介(1)
查看>>
Rsync基本操作加实时同步演练
查看>>