Java工程使用ffmpeg获取媒体信息及音视频拼接(ws.schild)

ws.schild的介绍及应用见上一篇文章:

Java工程使用ffmpeg进行音视频格式转换(ws.schild)_和光同尘ss的博客-CSDN博客

 

本文介绍获取媒体信息、音视频拼接的示例

 

1、获取音视频基础信息

public static MultimediaInfo parseInfo(String filePath) {
    File media = new File(filePath);
    MultimediaObject multimediaObject = new MultimediaObject(media);
    MultimediaInfo info = null;
    try {
        return multimediaObject.getInfo();
    } catch (EncoderException e) {
        e.printStackTrace();
    }
    return null;
}

返回格式:

{
    "audio": {
        "bitRate": 64000, 
        "channels": 2, 
        "decoder": "mp3", 
        "metadata": { }, 
        "samplingRate": 22050
    }, 
    "duration": 7630, 
    "format": "mp3", 
    "metadata": {
        "date": "2015-02-04T12:55:32", 
        "artist": "Bauchamp", 
        "album_artist": "Bauchamp", 
        "genre": "Electronic", 
        "track": "0", 
        "encoder": "Lavf58.23.101"
    }
}

其中duration是音视频时长,单位毫秒。

2、音视频拼接

ffmpeg拼接音频支持两种方式。

1. 直接进行文件拼接

原始命令

ffmpeg64 -i "concat:1.mp3|2.mp3" -acodec copy output.mp3

拼接1.mp3和2.mp3,重新编码输出为output.mp3,注意这种方式不会改变原数据格式,只是进行文件拼接。

java实现代码

public static boolean concat(String toMediaPath, String... fromMediaPaths) throws IOException {
    // ffmpeg64 -i "concat:1.mp3|2.mp3" -acodec copy output.mp3
    File to = new File(toMediaPath);
    if (to.exists()) {
        to.delete();
    }

    DefaultFFMPEGLocator locator = new DefaultFFMPEGLocator();
    ProcessWrapper ffmpeg = locator.createExecutor();
    // -i代表输入参数
    ffmpeg.addArgument("-i");
    // 需要连接到一起的音频文件
    String fromMedias = Arrays.stream(fromMediaPaths).collect(Collectors.joining("|"));
    ffmpeg.addArgument("concat:" + fromMedias);
    // 重新编码并复制到新文件中
    ffmpeg.addArgument("-acodec");
    ffmpeg.addArgument("copy");
    ffmpeg.addArgument(toMediaPath);

    ffmpeg.execute();
    BufferedReader reader = new BufferedReader(new InputStreamReader(ffmpeg.getErrorStream()));
    String msg = reader.lines().collect(Collectors.joining("\n"));
    System.out.println(msg);

    File newFile = new File(toMediaPath);
    if (newFile.exists()) {
        return true;
    }
    return false;
}

注:
这种方式拼接得音频可能在浏览器上无法完整播放。猜测原因可能是拼接得音频格式不完全统一导致的。

2. 清洗文件格式并重新编码

原始命令

ffmpeg -i input1.mp4 -i input2.webm -i input3.avi -filter_complex '[0:0] [0:1] [1:0] [1:1] [2:0] [2:1] concat=n=3:v=1:a=1 [v] [a]' -map '[v]' -map '[a]' <编码器选项> output.mkv

FFmpeg concat 过滤器会重新编码它们。注意这是有损压缩。

[0:0][0:1] [1:0][1:1] [2:0][2:1] 分别表示第一个输入文件的视频、音频、第二个输入文件的视频、音频、第三个输入文件的视频、音频。

concat=n=3:v=1:a=1 表示有三个输入文件,输出一条视频流和一条音频流。[v] [a] 就是得到的视频流和音频流的名字,注意在 bash 等 shell 中需要用引号,防止通配符扩展。

java实现代码,只实现了音频得拼接,视频需要自行调整命令实现。

public static boolean concat(String toMediaPath, String... fromMediaPaths) throws IOException {
    // ffmpeg -i input1.mp4 -i input2.webm -i input3.avi -filter_complex '[0:0] [0:1] [1:0] [1:1] [2:0] [2:1] concat=n=3:v=1:a=1 [v] [a]' -map '[v]' -map '[a]' <编码器选项> output.mkv
    File to = new File(toMediaPath);
    if (to.exists()) {
        to.delete();
    }

    DefaultFFMPEGLocator locator = new DefaultFFMPEGLocator();
    ProcessWrapper ffmpeg = locator.createExecutor();
    for (String from : fromMediaPaths) {
        ffmpeg.addArgument("-i");
        ffmpeg.addArgument(from);
    }
    ffmpeg.addArgument("-filter_complex");
    //ffmpeg.addArgument("\"[0:a] [1:a] [2:a] concat=n=3:v=0:a=1 [out]\"");
    ffmpeg.addArgument("[0:a] [1:a] [2:a] concat=n=3:v=0:a=2 [out]");
    ffmpeg.addArgument("-map");
    //ffmpeg.addArgument("\"[out]\"");
    ffmpeg.addArgument("[out]");
    ffmpeg.addArgument(toMediaPath);

    ffmpeg.execute();
    BufferedReader reader = new BufferedReader(new InputStreamReader(ffmpeg.getErrorStream()));
    String msg = reader.lines().collect(Collectors.joining("\n"));
    log.info("[concat] msg: {}", msg);

    ffmpeg.close();
    File newFile = new File(toMediaPath);
    if (newFile.exists()) {
        return true;
    }
    return false;
}

需要注意的是,windows和Linux格式不一样可能导致此方法不能同时运行在两个环境下。

参考链接:

https://www.jianshu.com/p/57936a52594e

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java本身不提供对视频和音频的处理功能,但可以使用第三方库来实现去除视频文件中的声音。常用的库是Xuggler和JAVE(Java Audio Video Encoder),它们都支持通过Java代码调用FFmpeg。以下是使用Xuggler的示例代码: ```java import com.xuggle.mediatool.IMediaReader; import com.xuggle.mediatool.IMediaWriter; import com.xuggle.mediatool.ToolFactory; import com.xuggle.xuggler.ICodec; public class RemoveAudioFromVideo { public static void main(String[] args) { String inputFilePath = "input.mp4"; String outputFilePath = "output.mp4"; IMediaReader mediaReader = ToolFactory.makeReader(inputFilePath); IMediaWriter mediaWriter = ToolFactory.makeWriter(outputFilePath, mediaReader); mediaReader.addListener(mediaWriter); mediaWriter.setForceInterleave(true); mediaWriter.addVideoStream(0, 0, ICodec.ID.CODEC_ID_H264, mediaReader.getContainer().getStream(0).getFrameRate().getDouble()); mediaWriter.addAudioStream(1, 0, 0, 0, 0); while (mediaReader.readPacket() == null) ; } } ``` 这段代码使用Xuggler读取输入文件,并将视频流写入到输出文件中,同时添加一个空音频流,从而达到去除视频文件中声音的目的。需要注意的是,Xuggler已经停止维护,如果需要更高级的功能,建议使用FFmpegJava接口或其他第三方库。 ### 回答2: Java本身没有提供直接去除视频文件中声音的功能,需要借助外部库或工具来实现此功能。FFmpeg是一个功能强大的音视频处理工具,可以用于处理和编辑音视频文件,包括去除视频中的声音。然而,Java并不直接集成FFmpeg,因此无法直接使用FFmpeg去除视频文件中的声音。 要使用Java去除视频文件中的声音,可以借助其他的Java库或框架来实现。一种方法是使用JavaCV库,它是一个基于Java的OpenCV和FFmpeg的接口库,可以让Java程序调用FFmpeg的功能。在使用JavaCV时,你可以调用FFmpeg的命令行参数来去除视频文件中的声音。 另一种方法是使用Java自带的音视频处理库,如javax.sound.sampled库来处理音频,然后使用Java图形库如JavaFX来处理视频。可以使用这些库读取原始的视频文件和音频文件,然后分离音频轨道和视频轨道,再将分离出的视频轨道合成成一个新的视频文件,从而达到去除视频文件中声音的效果。 总结来说,Java本身没有直接提供去除视频文件中声音的功能,但可以借助其他的Java库或工具来实现此功能,如JavaCV库或javax.sound.sampled库等。 ### 回答3: 在Java中,不使用FFmpeg去除视频文件中的声音是有一定的难度的。因为Java自带的库并没有提供直接处理视频文件的功能。但是,仍然可以通过其他方式来实现去除视频文件中声音的功能。 一种方法是使用Java提供的ProcessBuilder类来执行命令行操作。可以使用该类执行FFmpeg的命令行命令,通过命令行参数来实现去除视频文件中声音的功能。比如可以调用FFmpeg的命令行工具,使用“-an”参数来指定不提取音频流。这样执行命令后,会生成一个没有声音的新视频文件。 另一种方法是使用第三方Java库来处理视频文件。虽然Java本身没有支持直接处理视频文件的功能,但是有一些第三方Java库可以实现视频处理的功能,并可以实现去除声音的操作。例如,可以使用Xuggler库或者JavaCV库来处理视频文件。这些库提供了对FFmpeg的封装,可以在Java中调用FFmpeg的功能,包括去除视频文件中的声音。 无论使用哪种方法,都需要先确保系统中已经安装了FFmpeg,并正确设置了环境变量。然后,在Java代码中调用相应的命令行或者第三方库的函数,传入视频文件路径和相应的参数,即可实现去除视频文件中声音的功能。 需要注意的是,由于FFmpeg是一个强大的多媒体处理工具,其命令行参数众多,使用起来可能需要一定的学习和理解成本。同时,对于大文件或者复杂的视频文件,去除声音可能会消耗较长的时间和系统资源。因此,在实际应用中,需要根据具体情况选择最合适的方法来去除视频文件中的声音。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值