目录

目录

写在前面

MAVEN引用

获取音视频基本信息

音频转码成Mp3格式

视频转码成Mp4格式

视频转码成Mp4并添加文字水印

视频转码成Mp4并添加图片水印

测试代码


写在前面

如今各大云厂商都提供完整的音频处理服务,这些服务可以一站式完成音频/视频的存储/转码/分发等工作,我们完全不需要去研究其底层的实现原理。不过实际项目需求总是千奇百怪,有的客户可能有自己的硬编,只需要使用云场商的储存服务,而有的客户可能有自己的储存,但是想使用云厂商的音视频处理服务就比较麻烦了,那么使用本地FFmpeg完成音视频的转码就可以很好的解决这部分客户的需求了。使用JAVA调用FFmpeg可以先下载安装FFmpeg软件(下载地址https://ffmpeg.org/download.html),然后使用JAVA的 runtime.exec(ffmpeg命令)来完成所有的操作,不过这样有点麻烦。这么麻烦肯定有人会造轮子,然后找到了 JAVE (Java Audio Video Encoder) http://www.sauronsoftware.it/projects/jave/index.php ,这个框架封装了java操作ffmpeg音视频转码,使用起来方便多了,不过2009年后就没有更新了,使用的FFmpeg也是比较老的版本。然后又在GitHub找到了JAVE2 (Java Audio Video Encoder) https://github.com/a-schild/jave2,这套框架也是封装了FFmpeg,不需要Window/Linux/Mac分别去装对应的ffmpeg软件,使用的版本比较新,开箱即用,感觉比较香。接下来就简单介绍 JAVA2的基本使用。

MAVEN引用

    <properties><java.version>1.8</java.version><schild.version>3.0.1</schild.version></properties><dependency><groupId>ws.schild</groupId><artifactId>jave-all-deps</artifactId><version>${schild.version}</version></dependency><dependency><groupId>ws.schild</groupId><artifactId>jave-core</artifactId><version>${schild.version}</version></dependency><dependency><groupId>ws.schild</groupId><artifactId>jave-nativebin-win64</artifactId><version>${schild.version}</version></dependency><dependency><groupId>ws.schild</groupId><artifactId>jave-nativebin-linux64</artifactId><version>${schild.version}</version></dependency>

获取音视频基本信息

    /*** 获取音频基本信息** @param path 文件路径|URL* @throws EncoderException*/public static MultimediaInfo testMediaInfo(String path) throws EncoderException, MalformedURLException {MultimediaObject instance;if (path.startsWith("http")) {instance = new MultimediaObject(new URL(path));} else {instance = new MultimediaObject(new File(path));}return instance.getInfo();}/*** 原生调用ffmpeg获取音频基本信息** @param urlPath*/public static void testFFmpeg(String urlPath) {ProcessLocator processLocator = new DefaultFFMPEGLocator();ProcessWrapper ffmpeg = processLocator.createExecutor();ffmpeg.addArgument("-i");ffmpeg.addArgument(urlPath);try {ffmpeg.execute();String res = IOUtils.toString(ffmpeg.getErrorStream(), "UTF-8");System.out.println(res);} catch (Exception e) {e.printStackTrace();} finally {ffmpeg.destroy();}}

音频转码成Mp3格式

    /*** 转成Mp3** @param sourceFile* @param distFile* @param pListener* @throws EncoderException*/public static void codecToMp3(String sourceFile, String distFile, EncoderProgressListener pListener) throws EncoderException {System.out.println("testEncodeAudio1");File source = new File(sourceFile);File target = new File(distFile);if (target.exists()) {target.delete();}AudioAttributes audio = new AudioAttributes();audio.setCodec("libmp3lame");audio.setBitRate(128000);audio.setChannels(2);audio.setSamplingRate(44100);EncodingAttributes attrs = new EncodingAttributes();attrs.setOutputFormat("mp3");attrs.setAudioAttributes(audio);Encoder encoder = new Encoder();encoder.encode(new MultimediaObject(source), target, attrs, pListener);}

视频转码成Mp4格式

  /*** 转成Mp4** @param sourceFile* @param distFile* @param pListener* @throws EncoderException*/public static void codecToMp4(String sourceFile, String distFile, EncoderProgressListener pListener) throws EncoderException {File source = new File(sourceFile);File target = new File(distFile);if (target.exists()) {target.delete();}AudioAttributes audioAttr = new AudioAttributes();VideoAttributes videoAttr = new VideoAttributes();EncodingAttributes encodingAttr = new EncodingAttributes();audioAttr.setChannels(2);audioAttr.setCodec("aac");audioAttr.setBitRate(128000);audioAttr.setSamplingRate(44100);videoAttr.setCodec("libx264");videoAttr.setBitRate(2 * 1024 * 1024);videoAttr.setSize(new VideoSize(1080, 720));videoAttr.setFaststart(true);videoAttr.setFrameRate(29);encodingAttr.setAudioAttributes(audioAttr);encodingAttr.setVideoAttributes(videoAttr);encodingAttr.setOutputFormat("mp4");Encoder encoder = new Encoder();encoder.encode(new MultimediaObject(source), target, encodingAttr, pListener);}

视频转码成Mp4并添加文字水印

    /*** 添加文字水印** @param sourceFile* @param distFile* @param textWaterMark* @param pListener* @throws EncoderException*/public static void codecToMp4WithText(String sourceFile, String distFile, String textWaterMark, EncoderProgressListener pListener) throws EncoderException {File sourceVideo = new File(sourceFile);File target = new File(distFile);if (target.exists()) {target.delete();}DrawtextFilter vf = new DrawtextFilter(textWaterMark, "(w-text_w)/2", "(h-text_h)/2", "宋体", 30.0, new Color("ffffff", "44"));vf.setShadow(new Color("000000", "44"), 2, 2);VideoAttributes videoAttributes = new VideoAttributes();videoAttributes.addFilter(vf);EncodingAttributes attrs = new EncodingAttributes();attrs.setVideoAttributes(videoAttributes);Encoder encoder = new Encoder();encoder.encode(new MultimediaObject(sourceVideo), target, attrs, pListener);}

视频转码成Mp4并添加图片水印

    /*** 视频加图片水印** @param sourceFile* @param distFile* @param waterMark* @param pListener* @throws EncoderException*/public static void codecToMp4WithWaterMark(String sourceFile, String distFile, String waterMark, EncoderProgressListener pListener) throws EncoderException {File sourceVideo = new File(sourceFile);File watermark = new File(waterMark);VideoAttributes vidAttr = new VideoAttributes();vidAttr.addFilter(new OverlayWatermark(watermark, OverlayLocation.BOTTOM_RIGHT, -10, -10));EncodingAttributes encAttr = new EncodingAttributes().setVideoAttributes(vidAttr);File target = new File(distFile);new Encoder().encode(new MultimediaObject(sourceVideo), target, encAttr, pListener);}

测试代码

    public static void main(String[] args) throws EncoderException, MalformedURLException {String videoPath = "C:\\Users\\Administrator\\Videos\\258440.mp4";String wavPath = "C:\\Users\\Administrator\\Music\\3344927998404.wav";String mp3Path = "C:\\Users\\Administrator\\Music\\3344927998404.mp3";//测试获取视频信息MultimediaInfo info = testMediaInfo(videoPath);System.out.println(JSON.toJSONString(info));//测试音频转码codecToMp3(wavPath, mp3Path, new EncoderProgressListener() {@Overridepublic void sourceInfo(MultimediaInfo info) {System.out.println(JSON.toJSONString(info));}@Overridepublic void progress(int permil) {System.out.println(permil);}@Overridepublic void message(String message) {System.out.println(message);}});}

JAVA调用FFmpeg实现音视频转码加水印功能相关推荐

  1. C# 调用FFmpeg处理音视频的示例

    FFmpeg 开源.跨平台.体积小.功能强大,提供了录制.转换以及流化音视频的完整解决方案. 官网:https://www.ffmpeg.org/ 百科:https://baike.baidu.com ...

  2. 七牛云 转码_YYC松鼠短视频系统V2.0版本发布,亮点新增转码加水印功能

    YYC松鼠短视频系统V2.0版本发布,亮点新增转码加水印功能 YYC松鼠短视频系统2020年03月18日V2.0日志: 1.新增上传视频自动转码添加水印功能,水印可以设定四个位置,左上角,右上角,左下 ...

  3. FFmpeg Android 学习(一):Android 如何调用 FFMPEG 编辑音视频

    一.概述 在Android开发中,我们对一些音视频的处理比较无力,特别是编辑音视频这部分.而且在Android上对视频编辑方面,几乎没有任何API做支持,MediaCodec(硬编码)也没有做支持.那 ...

  4. 基于ffmpeg实现音视频转码

    一.背景 偶然的机会接触了ffmpeg,当时是从B站下载的视频转移到笔记本上看.使用b站手机客户端下载的视频格式为m4s的两个文件(video.m4s和audio.m4s),需要转成普通播放器支持的m ...

  5. 基于ffmpeg的音视频转码、压制、录屏、裁切、合并、提取

    ffmpeg转码.压制.录屏.裁切.合并.提取 1.ffmpeg介绍 2.转换格式 3.音频转码 4.视频转码 5.码率控制模式 6.合并.提取音视频 7.截取.连接音视频 8.截图.水印.动图 9. ...

  6. 使用java调用ffmpeg命令将视频分屏并音视频同时播放(二分屏)

    实现想法 使用ffmpeg命令中的filter_complex(滤镜)参数来进行展示 引入javacv版本 <dependency><groupId>org.bytedeco& ...

  7. Java借助ffmpeg进行音视频的格式转换(如m4a转mp3)

    FFmpeg 是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用 LGPL 或GPL 许可证(依据你选择的组件) FFmpeg 官网: FFMPEG分为3个版本:Static,Shared,D ...

  8. android端采用FFmpeg进行音视频合成与分离

    上一篇文章谈到音频剪切.混音.拼接与转码,也详细介绍cMake配置与涉及FFmpeg文件的导入: android端采用FFmpeg进行音频混合与拼接剪切 .现在接着探讨音视频的合成与分离. 1.音频提 ...

  9. java命令截图,GitHub - xuege-cn/fmj: FMJ (FFMpeg for Java)。通过Java调用FFMpeg命令的方式来对音视频进行处理(获取信息、截图等等)。...

    项目介绍 FMJ (FFMpeg for Java) 通过Java调用FFMpeg命令的方式来对音视频进行处理(获取信息.截图等等). FFMpeg安装 建议使用 ffmpeg-2.6.1 版本 Li ...

最新文章

  1. NVME CLI -- nvme 命令查看NVME设备内部状态
  2. 关于DWG文件转换成PDF
  3. 想自学Python却不知该如何入门?这篇文章带你轻松入门Python
  4. 不适合的任务:一个例子 启示:记住 我们选择做我们最擅长的事情,并且把事情做到最好
  5. python安装虚拟环境出现错误_virtualenv 安装虚拟环境问题 请大神指点一二
  6. 产品新人没有完整项目经验?这篇文章帮你打开思路
  7. C#LeetCode刷题之#622-设计循环队列​​​​​​​(Design Circular Queue)
  8. hive常见的DML操作
  9. 视频教程-CCNA自学视频课程专题四:CCNA认证重点难点解析3(扩展篇)-思科认证
  10. CubeMX配置SPI-Flash(W25Q256)
  11. python中不等于用什么符号_python中表示不等于的符号是什么
  12. LED点阵基础讲解及字符显示
  13. 【django】如何获取字段最大值,最新的记录
  14. jack分享的1-3开wifi 零火版本智能开关解决方案
  15. 无尽神域服务器维护,关于对无尽神域的感受亲爱的无尽神域开发团队:
  16. 用友NC65产品的对账节点联查业务帐
  17. docker之daemon.json文件
  18. 伊利收购澳优、蒙牛私有化雅士利,乳业双雄能在“奶粉界称王”吗?
  19. ←机器人工程或机器人方向毕业设计汇总篇→↓2022↑
  20. 记录小知识:Arouter 组件间通讯实体类数据

热门文章

  1. 如何正确选用防雷击浪涌保护元器件?
  2. 什么是冷钱包、热钱包?
  3. github资源收藏地
  4. 中文版onlyoffice镜像制作
  5. Jmeter(五)excel文件上传接口压力测试问题
  6. 使用SQL生成非均匀随机数
  7. 计算机类考研数据结构,【择校必看】十三所计算机专业课只考数据结构的985院校!...
  8. 笔记:AI芯片的未来创新方向
  9. 移动端扫描二维码下载app
  10. 《如果让我重新读次研究生》——王泛森院士 [建议研究生看看]