ffmpeg的各种黑科技

获取音频的时长

/**
     * 获取视频文件的时长
     * @param ffmpegPath 是ffmpeg软件存放的目录,sourceFile是目标文件
     * @return
     */
    public String duration(String ffmpegPath,String sourceFile){
        List<String> duration = new ArrayList<String>();
        String ffmpegroot = ffmpegPath+"/ffmpeg";
        duration.add(ffmpegroot);
        duration.add("-i");
        duration.add(sourceFile);
        ProcessBuilder pb = new ProcessBuilder();
        pb.command(duration);
        pb.redirectErrorStream(true);
        InputStream is = null;
        BufferedReader br = null;
        try {
            Process p = pb.start();
            is = p.getInputStream();
            StringBuffer outS = new StringBuffer("");
            br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            String line = br.readLine();
            while(line!=null){
                outS.append(line);
                line = br.readLine();
            }
            String out = outS.toString();
            int index = out.indexOf("Duration:");
            int end = out.indexOf(",", index);
            if(index>=0){
                String result = out.substring(index+10, end);
                return result;
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                br.close();
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }


音频的原时长:00:00:25.60

获取音频的多少秒(和上面那个方法一块使用)

 //参数格式:"00:00:10.68"  
    public float getTimelen(String timelen){ 
        float min=0.0f;  
        String strs[] = timelen.split(":");  
        if (strs[0].compareTo("0") > 0) {  
            min+=Integer.valueOf(strs[0])*60*60;//
        }  
        if(strs[1].compareTo("0")>0){  
            min+=Integer.valueOf(strs[1])*60;  
        }  
        if(strs[2].compareTo("0")>0){  
            min+=Float.valueOf(strs[2]);  
        }  
        return min;  
    } 

截取音频的指定时长

/**
     * 截取音频的  从front-duration秒
     * @param ffmpegPath ffmpeg程序的路径
     * @param sourcePath 源文件
     * @param targetPath 需要生成的文件
     * @param front      从多少秒开始截取
     * @param duration   一共截取多长时间
     * @throws Exception
     */
    public static void wavCut(String ffmpegPath,String sourcePath, String targetPath,double front,double duration) throws Exception {  
        List<String> wavToPcm = new ArrayList<String>();
        wavToPcm.add(ffmpegPath+"/ffmpeg");
        wavToPcm.add("-i");
        wavToPcm.add(sourcePath);
        wavToPcm.add("-ss");
        wavToPcm.add("00:00:0"+front);
        wavToPcm.add("-t");
        wavToPcm.add(duration+"");
        wavToPcm.add("-y");
        wavToPcm.add(targetPath);
        ProcessBuilder builder = new ProcessBuilder();
        builder.command(wavToPcm);
        for(String str:wavToPcm){
            System.out.print(str+" ");
        }
        System.out.println();
        builder.redirectErrorStream(true);
        try {
            Process process=builder.start();
            int a=process.waitFor();
        } catch (IOException e) {
            e.printStackTrace();
        } catch(InterruptedException ie){
            ie.printStackTrace();
        }
    }

tip注意

ffmpeg截取一段视频中一段视频

ffmpeg  -i ./plutopr.mp4 -vcodec copy -acodec copy -ss 00:00:10 -to 00:00:15 ./cutout1.mp4 -y

 

-ss time_off        set the start time offset 设置从视频的哪个时间点开始截取,上文从视频的第10s开始截取
-to 截到视频的哪个时间点结束。上文到视频的第15s结束。截出的视频共5s.
如果用-t 表示截取多长的时间如 上文-to 换位-t则是截取从视频的第10s开始,截取15s时长的视频。即截出来的视频共15s.
 
注意的地方是:
 如果将-ss放在-i ./plutopr.mp4后面则-to的作用就没了,跟-t一样的效果了,变成了截取多长视频。一定要注意-ss的位置。
 
参数解析
-vcodec copy表示使用跟原视频一样的视频编解码器。
-acodec copy表示使用跟原视频一样的音频编解码器。
 
-i 表示源视频文件
-y 表示如果输出文件已存在则覆盖。
----------------

音频格式转换 ---转8位

public static void changeWavToRightWav(String ffmpegPath,String sourcePath, String targetPath) throws Exception {  
            List<String> wavToWav = new ArrayList<String>();
            wavToWav.add(ffmpegPath+"/ffmpeg");
            wavToWav.add("-i");
            wavToWav.add(sourcePath);
            
            wavToWav.add("-ar");
            wavToWav.add("8000");
            
            wavToWav.add("-ac");
            wavToWav.add("1");
            
            wavToWav.add("-acodec");
            wavToWav.add("pcm_alaw");
            wavToWav.add("-y");
            wavToWav.add(targetPath);
            ProcessBuilder builder = new ProcessBuilder();
            builder.command(wavToWav);
            builder.redirectErrorStream(true);
            final Process process=builder.start();
            //处理InputStream的线程
            new Thread()
            {
                @Override
                public void run()
                {
                    BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); 
                    String line = null;
                    try 
                    {
                        while((line = in.readLine()) != null)
                        {
                            System.out.println("output: " + line);
                        }
                    } 
                    catch (IOException e) 
                    {                        
                        e.printStackTrace();
                    }
                    finally
                    {
                        try 
                        {
                            in.close();
                        } 
                        catch (IOException e) 
                        {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();
            new Thread()
            {
                @Override
                public void run()
                {
                    BufferedReader err = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
                    String line = null;
                    
                    try 
                    {
                        while((line = err.readLine()) != null)
                        {
                            System.out.println("err: " + line);
                        }
                    } 
                    catch (IOException e) 
                    {                        
                        e.printStackTrace();
                    }
                    finally
                    {
                        try 
                        {
                            err.close();
                        } 
                        catch (IOException e) 
                        {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();
            int a=process.waitFor();
        }

arm转wav

public static void changeAmrToWav(String ffmpegPath,String sourcePath, String targetPath) throws Exception {  
        List<String> wavToPcm = new ArrayList<String>();
        wavToPcm.add(ffmpegPath+"/ffmpeg");
        wavToPcm.add("-y");
        wavToPcm.add("-i");
        wavToPcm.add(sourcePath);
        wavToPcm.add("-acodec");
        wavToPcm.add("pcm_alaw");
        wavToPcm.add(targetPath);
        ProcessBuilder builder = new ProcessBuilder();
        builder.command(wavToPcm);
        builder.redirectErrorStream(true);
        final Process process=builder.start();
        //处理InputStream的线程
        new Thread()
        {
            @Override
            public void run()
            {
                BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); 
                String line = null;
                try 
                {
                    while((line = in.readLine()) != null)
                    {
                        System.out.println("output: " + line);
                    }
                } 
                catch (IOException e) 
                {                        
                    e.printStackTrace();
                }
                finally
                {
                    try 
                    {
                        in.close();
                    } 
                    catch (IOException e) 
                    {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
        new Thread()
        {
            @Override
            public void run()
            {
                BufferedReader err = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
                String line = null;
                
                try 
                {
                    while((line = err.readLine()) != null)
                    {
                        System.out.println("err: " + line);
                    }
                } 
                catch (IOException e) 
                {                        
                    e.printStackTrace();
                }
                finally
                {
                    try 
                    {
                        err.close();
                    } 
                    catch (IOException e) 
                    {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
        int a=process.waitFor();
    }

得到amr的时长

/**
     * 得到amr的时长
     * 
     * @param file
     * @return
     * @throws IOException
     */
    public static long getAmrDuration(File file) throws IOException {
        long duration = -1;
        int[] packedSize = { 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 };
        RandomAccessFile randomAccessFile = null;
        try {
            randomAccessFile = new RandomAccessFile(file, "rw");
            long length = file.length();//文件的长度
            int pos = 6;//设置初始位置
            int frameCount = 0;//初始帧数
            int packedPos = -1;
            /////////////////////////////////////////////////////
            byte[] datas = new byte[1];//初始数据值
            while (pos <= length) {
                randomAccessFile.seek(pos);
                if (randomAccessFile.read(datas, 0, 1) != 1) {
                    duration = length > 0 ? ((length - 6) / 650) : 0;
                    break;
                }
                packedPos = (datas[0] >> 3) & 0x0F;
                pos += packedSize[packedPos] + 1;
                frameCount++;
            }
            /////////////////////////////////////////////////////
            duration += frameCount * 20;//帧数*20
        } finally {
            if (randomAccessFile != null) {
                randomAccessFile.close();
            }
        }
        return duration;

    }

获取音频速率

/**
     * 功能:获取音频速率
     * @param file
     * @return
     * @throws Exception
     */
    public static Integer getWavRate(File file) throws Exception{
        FileInputStream fis = new FileInputStream(file);
        BufferedInputStream buffer = new BufferedInputStream(fis);
        AudioInputStream ain = AudioSystem.getAudioInputStream(buffer);
        AudioFormat format=ain.getFormat();
        Float frameRate = format.getFrameRate();
        return frameRate!=null?frameRate.intValue():0;
    }

 wav转pcm

public static void changeWavToPcm(String ffmpegPath,String sourcePath, String targetPath) throws Exception {  
    
        List<String> wavToPcm = new ArrayList<String>();
        wavToPcm.add(ffmpegPath+"/ffmpeg");
        wavToPcm.add("-y");
        wavToPcm.add("-i");
        wavToPcm.add(sourcePath);
        wavToPcm.add("-acodec");
        wavToPcm.add("pcm_s16le");
        wavToPcm.add("-f");
        wavToPcm.add("s16le"); 
        wavToPcm.add("-ac"); 
        wavToPcm.add("1"); 
        wavToPcm.add("-ar"); 
        wavToPcm.add("8000"); 
        wavToPcm.add(targetPath);
        ProcessBuilder builder = new ProcessBuilder();
        builder.command(wavToPcm);
        builder.redirectErrorStream(true);
        final Process process=builder.start();
        //处理InputStream的线程
        new Thread()
        {
            @Override
            public void run()
            {
                BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); 
                String line = null;
                try 
                {
                    while((line = in.readLine()) != null)
                    {
                        System.out.println("output: " + line);
                    }
                } 
                catch (IOException e) 
                {                        
                    e.printStackTrace();
                }
                finally
                {
                    try 
                    {
                        in.close();
                    } 
                    catch (IOException e) 
                    {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
        new Thread()
        {
            @Override
            public void run()
            {
                BufferedReader err = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
                String line = null;
                try 
                {
                    while((line = err.readLine()) != null)
                    {
                        System.out.println("err: " + line);
                    }
                } 
                catch (IOException e) 
                {                        
                    e.printStackTrace();
                }
                finally
                {
                    try 
                    {
                        err.close();
                    } 
                    catch (IOException e) 
                    {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
        process.waitFor();
    
    }

 获取视频的第一秒截图

package com.lzh.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;

/**
 * 
 * @Description: 获取视频的信息
 */
public class FetchVideoCover {
    // 视频路径
    private String ffmpegEXE;

    public void getCover(String videoInputPath, String coverOutputPath) throws IOException, InterruptedException {
//        ffmpeg.exe -ss 00:00:01 -i spring.mp4 -vframes 1 bb.jpg
        List<String> command = new java.util.ArrayList<String>();
        command.add(ffmpegEXE);
        
        // 指定截取第1秒
        command.add("-ss");
        command.add("00:00:01");
                
        command.add("-y");
        command.add("-i");
        command.add(videoInputPath);
        
        command.add("-vframes");
        command.add("1");
        
        command.add(coverOutputPath);
        
        for (String c : command) {
            System.out.print(c + " ");
        }
        
        ProcessBuilder builder = new ProcessBuilder(command);
        Process process = builder.start();
        
        InputStream errorStream = process.getErrorStream();
        InputStreamReader inputStreamReader = new InputStreamReader(errorStream);
        BufferedReader br = new BufferedReader(inputStreamReader);
        
        String line = "";
        while ( (line = br.readLine()) != null ) {
        }
        
        if (br != null) {
            br.close();
        }
        if (inputStreamReader != null) {
            inputStreamReader.close();
        }
        if (errorStream != null) {
            errorStream.close();
        }
    }

    public String getFfmpegEXE() {
        return ffmpegEXE;
    }

    public void setFfmpegEXE(String ffmpegEXE) {
        this.ffmpegEXE = ffmpegEXE;
    }

    public FetchVideoCover() {
        super();
    }

    public FetchVideoCover(String ffmpegEXE) {
        this.ffmpegEXE = ffmpegEXE;
    }
    
    public static void main(String[] args) {
        // 获取视频信息。
        FetchVideoCover videoInfo = new FetchVideoCover("c:\ffmpeg\bin\ffmpeg.exe");
        try {
            videoInfo.getCover("c:\北京北京.avi","c:\北京.jpg");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
View Code

视频和mp3合并

package com.lzh.utils;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class MergeVideoMp3 {

    private String ffmpegEXE;
    
    public MergeVideoMp3(String ffmpegEXE) {
        super();
        this.ffmpegEXE = ffmpegEXE;
    }
    
    public void convertor(String videoInputPath, String mp3InputPath,
            double seconds, String videoOutputPath) throws Exception {
//        ffmpeg.exe -i 苏州大裤衩.mp4 -i bgm.mp3 -t 7 -y 新的视频.mp4
        List<String> command = new ArrayList<>();
        command.add(ffmpegEXE);
        
        command.add("-i");
        command.add(videoInputPath);
        
        command.add("-i");
        command.add(mp3InputPath);
        
        command.add("-t");
        command.add(String.valueOf(seconds));
        
        command.add("-y");
        command.add(videoOutputPath);
        
        for (String c : command) {
            System.out.print(c + " ");
        }
        
        ProcessBuilder builder = new ProcessBuilder(command);
        Process process = builder.start();
        
        InputStream errorStream = process.getErrorStream();
        InputStreamReader inputStreamReader = new InputStreamReader(errorStream);
        BufferedReader br = new BufferedReader(inputStreamReader);
        
        String line = "";
        while ( (line = br.readLine()) != null ) {
        }
        
        if (br != null) {
            br.close();
        }
        if (inputStreamReader != null) {
            inputStreamReader.close();
        }
        if (errorStream != null) {
            errorStream.close();
        }
        
    }

    public static void main(String[] args) {
        MergeVideoMp3 ffmpeg = new MergeVideoMp3("C:\ffmpeg\bin\ffmpeg.exe");
        try {
            ffmpeg.convertor("C:\苏州大裤衩.mp4", "C:\music.mp3", 7.1, "C:\这是通过java生产的视频.mp4");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
View Code
原文地址:https://www.cnblogs.com/coder-lzh/p/9550263.html