Java 执行FFmpeg 修改音频采用率

背景

想要把音频采样率为24000的mp3修改44100的mp3 ,感觉执行FFmpeg命令方式比较简单直接,本次采用了这种方式

使用FFmpeg修改音频采样率

经过AI工具得知命令如下

ffmpeg -i input.mp3 -ar 44100 output.mp3

命令解析

-i:这是“input”的缩写,代表输入文件。后面应该跟着输入文件的路径。

-ar:这是“audio rate”的缩写,用于设置音频的采样率。在您给出的命令中,它被设置为 44100,这是常见的音频采样率,表示每秒采样44100次。

然后用Java调用该命令即可

@Slf4j
public class FFmpegUtils {

    private static String FFMPEG_PATH = "C:\\soft\\ffmpeg\\ffmpeg\\ffmpeg\\bin\\ffmpeg.exe";

    public static boolean execute(String srcPath, String destPath, String... params) {
        File file = new File(destPath);
        File parent = file.getParentFile();
        if (!parent.exists()) {
            parent.mkdirs();
        }
        StringBuilder cmd = new StringBuilder();
        cmd.append(FFMPEG_PATH);
        cmd.append(" ");
        cmd.append("-i " + srcPath);
        if (params != null && params.length > 0) {
            for (String param : params) {
                cmd.append(" ").append(param).append(" ");
            }
        }
        cmd.append(" ");
        cmd.append(destPath);
        boolean result = true;
        try {
            Process proc = Runtime.getRuntime().exec(cmd.toString());
            FFmpegInterceptor error = new FFmpegInterceptor(proc.getErrorStream());
            FFmpegInterceptor output = new FFmpegInterceptor(proc.getInputStream());
            error.run();
            output.run();
            proc.waitFor();
        } catch (Exception e) {
            result = false;
            log.error("ffmeg执行失败", e);
        }

        return result;
    }
}
  @Test
    public void updateSimpleRate() throws Exception {
        String descPath = "C:\\Users\\Administrator\\Desktop\\output22.mp3";
        String srcPath = "C:\\Users\\Administrator\\Desktop\\6f69d97cc97e4c8a9a8dcec7b1cb85ab.mp3";
         FFmpegUtils.execute(srcPath, descPath, "-ar  44100");
    }

Runtime.getRuntime():是一个静态方法,用于获取当前Java应用程序的运行时环境实例
exec() :可以执行外部程序,模拟终端或命令行的行为

以下是 Runtime.getRuntime().exec() 方法的一些关键作用和特性

1.  执行外部命令:可以用来执行任何可以在命令行直接输入的操作系统命令或可执行文件,比如打开浏览器、运行脚本、调用系统工具(如 ffmpeg)等。

2. 创建子进程:当调用 exec() 方法时,Java虚拟机会创建一个新的子进程来执行指定的命令,这意味着外部命令是在与Java程序分离的进程中运行的。

3. 重定向IO流:通过返回的 Process 对象,可以控制外部程序的输入输出。你可以获取子进程的输入流、输出流和错误流,从而读取命令输出,向命令发送输入数据,或捕获命令执行过程中的错误信息。

4. 等待命令完成:通过 Process 对象的 waitFor() 方法,可以让主程序等待子进程结束,获取其退出状态码,判断命令是否成功执行。

5. 环境变量配置:某些重载的 exec() 方法允许传递环境变量数组,这样可以在特定的环境中执行命令。

6. 资源管理:虽然 exec() 提供了强大的功能,但使用时需谨慎,因为它可能影响系统资源,如未正确处理流可能导致死锁,或者过多的子进程消耗系统资源
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
转换下面这些音频和视频,压缩包有包和源码,还有文档api. 整理资料不易,不喜欢可以自己百度 Audio decoders adpcm_4xm adpcm_adx adpcm_ct adpcm_ea adpcm_ea_r1 adpcm_ea_r2 adpcm_ea_r3 adpcm_ea_xas adpcm_ima_amv adpcm_ima_dk3 adpcm_ima_dk4 adpcm_ima_ea_eacs adpcm_ima_ea_sead adpcm_ima_qt adpcm_ima_smjpeg adpcm_ima_wav adpcm_ima_ws adpcm_ms adpcm_sbpro_2 adpcm_sbpro_3 adpcm_sbpro_4 adpcm_swf adpcm_thp adpcm_xa adpcm_yamaha alac ape atrac 3 cook dca dsicinaudio flac g726 imc interplay_dpcm liba52 libamr_nb libamr_wb libfaad libgsm libgsm_ms mace3 mace6 mp2 mp3 mp3adu mp3on4 mpc sv7 mpc sv8 mpeg4aac nellymoser pcm_alaw pcm_mulaw pcm_s16be pcm_s16le pcm_s16le_planar pcm_s24be pcm_s24daud pcm_s24le pcm_s32be pcm_s32le pcm_s8 pcm_u16be pcm_u16le pcm_u24be pcm_u24le pcm_u32be pcm_u32le pcm_u8 pcm_zork qdm2 real_144 real_288 roq_dpcm shorten smackaud sol_dpcm sonic truespeech tta vmdaudio vorbis wavpack wmav1 wmav2 ws_snd1 xan_dpcm Audio encoders ac3 adpcm_adx adpcm_ima_wav adpcm_ms adpcm_swf adpcm_yamaha flac g726 libamr_nb libamr_wb libfaac libgsm libgsm_ms libmp3lame libvorbis mp2 pcm_alaw pcm_mulaw pcm_s16be pcm_s16le pcm_s24be pcm_s24daud pcm_s24le pcm_s32be pcm_s32le pcm_s8 pcm_u16be pcm_u16le pcm_u24be pcm_u24le pcm_u32be pcm_u32le pcm_u8 pcm_zork roq_dpcm sonic sonicls vorbis wmav1 wmav2 Video decoders 4xm 8bps VMware video aasc amv asv1 asv2 avs bethsoftvid bmp c93 camstudio camtasia cavs cinepak cljr cyuv dnxhd dsicinvideo dvvideo dxa ffv1 ffvhuff flashsv flic flv fraps gif h261 h263 h263i h264 huffyuv idcinvideo indeo2 indeo3 interplayvideo jpegls kmvc loco mdec mjpeg mjpegb mmvideo mpeg1video mpeg2video mpeg4 mpegvideo msmpeg4 msmpeg4v1 msmpeg4v2 msrle msvideo1 mszh nuv pam pbm pgm pgmyuv png ppm ptx qdraw qpeg qtrle rawvideo roqvideo rpza rv10 rv20 sgi smackvid smc snow sp5x svq1 svq3 targa theora thp tiertexseqvideo tiff truemotion1 truemotion2 txd ultimotion vb vc1 vcr1 vmdvideo vp3 vp5 vp6 vp6a vp6f vqavideo wmv1 wmv2 wmv3 wnv1 xan_wc3 xl zlib zmbv Video encoders asv1 asv2 bmp dnxhd dvvideo ffv1 ffvhuff flashsv flv gif h261 h263 h263p huffyuv jpegls libtheora libx264 libxvid ljpeg mjpeg mpeg1video mpeg2video mpeg4 msmpeg4 msmpeg4v1 msmpeg4v2 pam pbm pgm pgmyuv png ppm qtrle rawvideo roqvideo rv10 rv20 sgi snow svq1 targa tiff wmv1 wmv2 zlib zmbv
要在Java中使用FFmpeg分离MP4中的音频,可以使用FFmpeg的命令行工具来实现。首先,你需要确保你的系统已经安装了FFmpeg。 下面是一个示例的Java方法,用于使用FFmpeg命令行工具来分离MP4文件中的音频: ```java import java.io.IOException; public class FFmpegUtils { public static void extractAudioFromMp4(String srcFile, String targetFile) throws IOException { String ffmpegCommand = "ffmpeg -i " + srcFile + " -vn -acodec copy " + targetFile; Process process = Runtime.getRuntime().exec(ffmpegCommand); // 等待FFmpeg命令执行完毕 try { process.waitFor(); } catch (InterruptedException e) { e.printStackTrace(); } // 检查FFmpeg命令是否执行成功 if (process.exitValue() != 0) { throw new IOException("FFmpeg command failed"); } } } ``` 在上面的示例代码中,`srcFile`是原始的MP4文件路径,`targetFile`是目标音频文件路径。该方法会使用FFmpeg命令行工具执行命令`ffmpeg -i 输入文件路径 -vn -acodec copy 输出文件路径`来分离MP4的音频流并保存为目标音频文件。 你可以将上述代码添加到你的Java项目中,并使用`FFmpegUtils.extractAudioFromMp4`方法来分离音频。 请注意,为了能够成功执行该方法,你需要确保系统中已经正确安装了FFmpeg,并且FFmpeg命令行工具在系统的环境变量中可用。 参考资料: 上一篇文章谈到音频剪切、混音、拼接与转码,也详细介绍cMake配置与涉及FFmpeg... 链接:https://pan.baidu.com/s/1tqPF65xKlWOE3F6x00HLxQ 提取码:ruzy

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值