使用ffmpeg实现给音频,视频添加水印的操作

这篇具有很好参考价值的文章主要介绍了使用ffmpeg实现给音频,视频添加水印的操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文主要针对ffmpeg进行整理,从而解决在现实中可能存在的问题。

1.下载配置ffmpeg

这里参考的是

Java后台用ffmpeg命令给视频添加水印 - ^身后有尾巴^ - 博客园 (cnblogs.com)

1:先去ffmpeg官网下载其压缩包  Download FFmpeg使用ffmpeg实现给音频,视频添加水印的操作

下载,解压到指定位置 

2.将压缩包拷贝到你想的任意位置并解压,正常解压出来的文件名过长,也可能会有空格,我们最好将文件夹下的文件拷贝出来到一个新的文件夹FFmpeg下

使用ffmpeg实现给音频,视频添加水印的操作

 3.配置环境变量

使用ffmpeg实现给音频,视频添加水印的操作

4.查看你的ffmpeg是否安装好,win+r 输入cmd,在里面输入ffmpeg -version,显示如下则安装成功

使用ffmpeg实现给音频,视频添加水印的操作

2.给视频添加水印

 1.在你的项目下新增工具类ProcessExec 一下是工具类里的代码

/**
 * @author JingJian
 * @version 1.0
 * @date 2022/2/10 14:43
 */

import com.baomidou.mybatisplus.toolkit.StringUtils;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ProcessExec {

    private Process process;

    public void execute(Map<String, String> dto) {
        StringBuffer waterlogo = new StringBuffer();
        waterlogo.append(" -i ");
//        输入文件
        if (null != dto.get("input_path") && StringUtils.isNotEmpty(dto.get("input_path"))) {
            waterlogo.append(dto.get("input_path"));
        }
        waterlogo.append("  -vf \"movie=");
//        添加的水印
        if (null != dto.get("logo") && StringUtils.isNotEmpty(dto.get("logo"))) {
            waterlogo.append(dto.get("logo"));
        }
        //        宽:高
        if (null != dto.get("wh") && StringUtils.isNotEmpty(dto.get("wh"))) {
            waterlogo.append(",scale= ");
            waterlogo.append(dto.get("wh"));
        }else{
            waterlogo.append(",scale= 60: 60");
        }
        waterlogo.append(" [watermark]; [in][watermark] overlay=main_w-overlay_w-10:main_h-overlay_h-10 [out]\" ");
        if (null != dto.get("video_converted_path") && StringUtils.isNotEmpty(dto.get("video_converted_path"))) {
            waterlogo.append(dto.get("video_converted_path"));
        }
        System.out.println(waterlogo);
        Runtime run = Runtime.getRuntime();
        String ffmegPath = null;
        if (StringUtils.isNotEmpty(dto.get("ffmpeg_path"))) {
            ffmegPath = dto.get("ffmpeg_path");
        }
// 执行命令
        try {
            System.out.println("执行的命令"+waterlogo);
            java.lang.Process process = run.exec(ffmegPath + waterlogo);
// 异步读取输出
            InputStream inputStream = process.getInputStream();
            InputStream errorStream = process.getErrorStream();
                    /* BufferedReader br=new BufferedReader(new InputStreamReader(inputStream,"gbk"));
                     String str1="";
                     while((str=br.readLine())!=null){
                         System.out.println(str1);
                     }*/

            ExecutorService service = Executors.newFixedThreadPool(2);

            ResultStreamHandler inputStreamHandler = new ResultStreamHandler(inputStream);
            ResultStreamHandler errorStreamHandler = new ResultStreamHandler(errorStream);

            service.execute(inputStreamHandler);
            service.execute(errorStreamHandler);

            process.waitFor();
            service.shutdownNow();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
2.新增控制台输入代码 ResultStreamHandler 
/**
 * @author JingJian
 * @version 1.0
 * @date 2022/2/10 14:45
 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ResultStreamHandler
        implements Runnable {
    private InputStream inputStream;

    ResultStreamHandler( InputStream inputStream ) {
        this.inputStream = inputStream;
    }

    public void run() {

        BufferedReader bufferedReader = null;
        try {
            bufferedReader = new BufferedReader( new InputStreamReader( inputStream,"gbk" ) );
            String line = null;

            while ( ( line = bufferedReader.readLine() ) != null ) {
                System.out.println( line );
            }
        }
        catch ( Throwable t ) {
        }
        finally {
            try {
                bufferedReader.close();
            }
            catch ( IOException e ) {
            }
        }
    }

}
3.CmdOutputGetter接口代码
public interface CmdOutputGetter {
    public void dealLine(String str);
}

4..调用添加水印工具类代码

/**
 * @author JingJian
 * @version 1.0
 * @date 2022/2/10 14:46
 * 视频添加水印logo
 */
import java.util.HashMap;

public class test {

    public static void main(String[] args) {
        ProcessExec ps = new ProcessExec();
        HashMap<String, String> dto=new HashMap<String, String>();
        //必填:此处是ffmpeg.exe所在位置,也就FFmpeg文件夹bin目录下的ffmpeg.exe
        dto.put("ffmpeg_path","D:\\myDemo\\tools\\ffmpeg\\bin\\ffmpeg.exe");
        //必填;此处是你要处理的视频位置
        dto.put("input_path", "D:\\myDemo\\tools\\MV\\test.mp4");
        //必填;此处是完成添加水印后输入视频的位置并重新命名该视频
        dto.put("video_converted_path", "D:\\myDemo\\tools\\MV\\TEST3.mp4");
        //必填;此处是你要添加的水印位置,注意此处图片位置一定要加上转译符,否则识别不了盘符
        dto.put("logo", "d\\\\:/myDemo/tools/MV/icon-my.png");
//        宽度:高度 (不是比例,是尺寸,默认 60:60)
        dto.put("wh", "80: 60");
        ps.execute(dto);
    }
}

3.给音频添加水印

1.首先maven引入第三方工具包:

<!-- 引入三方工具包 -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.4.6</version>
</dependency>
<dependency> 
    <groupId>org</groupId>
    <artifactId>jaudiotagger</artifactId>
    <version>2.0.1</version>
</dependency>

2.创建一个工具类:AudioUtils,并添加以下方法


import org.jaudiotagger.audio.mp3.MP3AudioHeader;
import org.jaudiotagger.audio.mp3.MP3File;

/**
 * @author JingJian
 * @version 1.0
 * @date 2022/2/10 14:50
 */
public class AudioUtils {

//    public static String

    /**
     * 获取音频播放时长,返回值单位秒
     *
     * @param path 音频路径
     * @return
     */
    public static Integer getAudioDuration(String path) {
        try {
            MP3File file = new MP3File(path);
            MP3AudioHeader audioHeader = (MP3AudioHeader) file.getAudioHeader();
            return audioHeader.getTrackLength();
        } catch (Exception e) {
            System.out.println("获取音频播放时长失败!ERROR:{}");
            return null;
        }
    }
}

3.再创建一个工具类:CmdExecutor,用来执行FFmpeg指令

import java.io.BufferedReader;
import java.io.InputStreamReader;

/**
 * 脚本命令执行器
 * @author JingJian
 * @version 1.0
 * @date 2022/2/10 14:51
 */
public class CmdExecutor {

    /**
     * CMD操作
     * @param getter 获取控制台打印信息
     * @param cmd 命令
     */
    public static void exec(CmdOutputGetter getter, String... cmd) {
        try {
            // 创建新线程
            ProcessBuilder builder = new ProcessBuilder();
            // 执行命令
            builder.command(cmd);
            builder.redirectErrorStream(true);
            Process proc = builder.start();
            BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String line;
            while ((line = stdout.readLine()) != null) {
                if (getter != null)
                    getter.dealLine(line);
            }
            proc.waitFor();
            stdout.close();
        } catch (Exception e) {
        }
    }
}

4.测试代码文章来源地址https://www.toymoban.com/news/detail-405041.html

import org.junit.Test;
import java.io.File;
import java.util.Objects;

/**
 * 为音频添加水印
 * @author JingJian
 * @version 1.0
 * @date 2022/2/10 14:51
 */
//一般水印音频都是一段口播文字,可以到这个网站(https://www.zaixianai.cn/voiceCompose)去花去1块钱文字转语音一下
public class FFmpegTest {
    /**
     * 为音频文件添加水印
     * @param watermarkFilePath 水印文件路径
     * @param audioPath         源音频文件路径
     * @param ffmpegFile   ffmpeg程序位置
     */
    public static String addWatermark4Audio(String watermarkFilePath, String audioPath,String ffmpegFile) {
        // 获取源音频文件播放时长
        Integer duration = AudioUtils.getAudioDuration(audioPath);
        if (Objects.isNull(duration)) {
            System.out.println("获取音频文件时长失败");
            return audioPath;
        }
        System.out.println("源音频时长:" + duration);
        final String separator = File.separator;
        String newAudioPath =audioPath.substring(0,audioPath.lastIndexOf(separator)+1)+"w"+audioPath.substring(audioPath.lastIndexOf(separator)+1);
        String[] command4addWatermark = {ffmpegFile, "-i", audioPath, "-stream_loop", "-1", "-i", watermarkFilePath,
                "-filter_complex", "[1:a][0:a]amix", "-t", duration + "", "-ar", "48000", "-f", "mp3", newAudioPath,
                "-y"};
        CmdExecutor.exec(new CmdOutputGetter() {
            @Override
            public void dealLine(String line) {
                //把cmd输出的信息每行syso,这个是实时输出的,可以换其他的处理方式
                System.out.println(line);
            }
        }, command4addWatermark);

        System.out.println("添加音频水印完成!路径:" + newAudioPath);
        return newAudioPath.substring(newAudioPath.lastIndexOf(separator)+1);
    }

    @Test
    public void addWaterMark() {
        String ffmpegFile = "D:/myDemo/tools/ffmpeg/bin/ffmpeg.exe";
//        音频水印文件地址 会一直重复播放,如果需要间隔,可以使用格式工厂等制作间隔水印
        String watermarkFilePath = "C:/Users/admin/Music/音频水印/watermark.mp3";
        // 需要添加水印的音频文件
        String audioPath = "C:/Users/admin/Music/Paradise.mp3";
        // 添加水印
        addWatermark4Audio(watermarkFilePath, audioPath,ffmpegFile);
    }

}

到了这里,关于使用ffmpeg实现给音频,视频添加水印的操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FFmpeg代码实现抽取音频、视频数据

    今天开始撸代码,首先使用FFmpeg的API抽取一个MP4文件的音频数据。 应该是第一次在Mac上做C/C++开发,纠结过后选择使用CLion 开发。CLion是 JetBrains下专门用来开发C/C++的IDE,已经用习惯了Android studio和IntelliJ IDEA ,所以CLion用起来还是很顺手的。 在新建一个C项目后,需要把FFmpe

    2024年02月08日
    浏览(27)
  • ffmpeg在随机位置添加图片水印

     5秒添加一次 -i 输入的视频源 water.jpg放在跟视频一起的位置 temp.mp4是输出的视频

    2023年04月09日
    浏览(22)
  • uni-app 实现图片上传添加水印操作

    改进原因: 1、Canvas 2D(新接口)需要显式设置画布宽高,默认:300 150,最大:1365 1365 ios 无法上传较大图片的尺寸,固对超过此尺寸的图片进行了等比缩放的处理; 2、在页面中设置canvas宽高,导致页面有滚动条;现在采用离屏的canvas,但是离屏的canvas,canvasToTempFilePath方法

    2024年02月07日
    浏览(53)
  • 【FFmpeg】音视频录制 ① ( 查询系统中 ffmpeg 可录制的音视频输入设备 | 使用 ffmpeg 命令录制音视频数据 | 录制视频数据命令 |录制音频数据| 同时录制音频和视频数据命令 )

    在 Windows 系统中 , 使用 ffmpeg 命令 录制 音视频 , 需要先获取 系统的 音视频设备 信息 , 录制 音视频 本质上是从 系统音视频设备 中获取数据 ; 执行 命令 , 可以获取 系统中 ffmpeg 可用的 DirectShow 音视频输入设备 ; 命令参数解析 : -list_devices true : 列出所有 ffmpeg 的 指定类型的可

    2024年04月25日
    浏览(68)
  • qt+ffmpeg 实现音视频播放(二)之音频播放

    通过  avformat_open_input () 打开媒体文件并分配和初始化  AVFormatContext   结构体。 函数原型如下: int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options); 参数说明: - `ps`:指向 `AVFormatContext` 结构体指针的指针,用于存储打开的媒体文件的信息。

    2024年04月22日
    浏览(34)
  • 使用ffmpeg从视频文件中提取音频文件、视频抽帧和切割视频

    目录 ffmpeg下载 使用ffmpeg从视频文件中提取音频文件 批量提取文件夹下多个视频文件的音频 使用ffmpeg从视频文件中提取视频帧 使用ffmpeg将按固定时长将视频切割成多个小片段 将分割得到的视频存放在新建文件夹下(这个我运行的时候好像有点问题,音频文件没有存放在新建

    2023年04月08日
    浏览(43)
  • 使用ffmpeg调整视频中音频采样率及声道

    通过ffmpeg -i命令查看视频基本信息 -r fps每秒传输帧数,默认为25 -s 分辨率 -ar 设定采样率 -ac 设定声音的Channel数 -acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器 FFmpeg项目由 Fabrice Bellard在2000年创立。到目前为止,FFmpeg项目的开发者仍然与VLC、MPV、dav1d、x

    2024年01月23日
    浏览(36)
  • 【FFmpeg】学会添加水印,只要这一篇就足够

    打算写这样一篇文章很久了,算是对过往的一种总结,也希望能获得更多的反馈继续迭代。在这个人类的主要信息载体已经变为视频的年代,水印的添加也成为了一个许多人不可或缺的技能,对于技术人来讲,那就更不用提。本文详细的介绍了通过FFmpeg为视频添加各种各样的

    2024年02月01日
    浏览(35)
  • OpenAI Whisper + FFmpeg + TTS:动态实现跨语言视频音频翻译

    本文作者系360奇舞团前端开发工程师 本文介绍了如何结合 OpenAI Whisper、FFmpeg 和 TTS(Text-to-Speech)技术,以实现将视频翻译为其他语言并更换声音的过程。我们将探讨如何使用 OpenAI Whisper 进行语音识别和翻译,然后使用 FFmpeg 提取视频音轨和处理视频,最后使用 TTS 技术生成新

    2024年02月09日
    浏览(37)
  • 利用FFmpeg实现录屏、直播推流、音频视频格式转换、剪裁等功能

    一、FFmpeg简介。 二、FFmpeg常用参数及命令。 三、FFmpeg在Unity 3D中的使用。 1、FFmpeg 录屏。 2、FFmpeg 推流。 3、FFmpeg 其他功能简述。 对于FFmpeg,其官网上是这样介绍的: FFmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything th

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包