博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用java调用FFMPEG进行转码
阅读量:5906 次
发布时间:2019-06-19

本文共 4037 字,大约阅读时间需要 13 分钟。

hot3.png

使用java调用FFMPEG进行转码

import  java.io.BufferedReader;import  java.io.IOException;import  java.io.InputStream;import  java.io.InputStreamReader;import  java.io.OutputStream;public class TestFFmpeg {static String ffmpeg_cmd = "/home/andrew/Work/FFmpeg/ffmpeg-3.2/ffmpeg";//static String in = "/home/andrew/Work/FFmpeg/ffmpeg-3.2/test_2200kbps.flv";//static String out = "/home/andrew/Work/FFmpeg/ffmpeg-3.2/test_out.flv";static String in = "rtmp://223.203.1.34:1936/live?vhost=cc.com/stream1_1";static String out = "rtmp://223.203.1.34:1936/live?vhost=cc.com/stream2";static Process p;public static void main(String[] args) {        Runtime rt = Runtime.getRuntime() ;        int r = -1;        Thread stoppingThread;        Thread errorStream;        Thread inputStream;        System.out.println(in);        System.out.println(out);        String[] cmd1 = new String[] {ffmpeg_cmd, "-re", "-i", in, "-acodec", "aac", "-ar", "44100", "-vcodec", "copy", "-report" , "-y", "-f", "flv", out};        //String cmd1 = ffmpeg_cmd + " -re" + " -i " + in + " -acodec", " aac", " -ar" + " 44100" + " -vcodec" + " copy" + " -report" + " -y"," -f" + " flv " + out;        try {                System.out.println(cmd1);                p = rt.exec(cmd1);                StopTranscoder stopRunnable = new StopTranscoder(p);                stoppingThread = new Thread(stopRunnable);                stoppingThread.start();                final InputStream is1 = p.getErrorStream ();                final InputStream is2 = p.getInputStream ();                //启动两个线程,一个线程负责读标准输出流,另一个负责读标准错误流                  GetStream streamErr = new GetStream(is1);                errorStream = new Thread(streamErr);                errorStream.start();                GetStream streamIn = new GetStream(is2);                inputStream = new Thread(streamIn);                inputStream.start();                System.out.println("waiting for");                try {                        r = p.waitFor();                } catch (InterruptedException e) {                        e.printStackTrace();                }        } catch (Exception e) {                e.printStackTrace();        }        System.out.println(r);        p.destroy();       }}class StopTranscoder implements Runnable {        private Process process  = null;        public StopTranscoder(Process proc){                this.process  = proc;        }        public void run() {                try {                        System.out.println("kill before sleep");                        Thread.sleep(10000);                        System.out.println("kill after sleep");                        this.process.destroy();                } catch (Exception e) {                        e.printStackTrace();                }        }}class GetStream implements Runnable {        private InputStream is;        public GetStream(InputStream stream) {                is = stream;        }        public void run() {                BufferedReader br = new BufferedReader(new InputStreamReader(is));                try {                        String line = null;                        while ((line = br.readLine()) != null) {                                if (line != null){                                        System.out.println(line);                                }                        }                } catch (IOException e) {                        e.printStackTrace();                }                finally{                        try {                                is.close();                        } catch (IOException e) {                                e.printStackTrace();                        }                }        }}

执行FFMPEG

启动FFMPEG进程,Runtime.getRuntime().exec(cmd)

 

 

启动两个线程,一个线程负责读标准输出流,另一个负责读标准错误流

当Runtime对象调用exec(cmd)后,JVM会启动一个子进程,该进程会与JVM进程建立三个管道连接:标准输入,标准输出和标准错误流。假设该程序不断在向标准输出流和标准错误流写数据,而JVM不读取的话,当缓冲区满之后将无法继续写入数据,最终造成阻塞在waitfor()这里。

 

注释:

之前遇到过调用process.destroy()有可能无法使FFMPEG退出的情况,所以增加了类StopTranscoder()进行测试,但是没有复现之前的问题。

 

转载于:https://my.oschina.net/u/2326611/blog/810422

你可能感兴趣的文章
vsftp:500 OOPS: could not bind listening IPv4 sock
查看>>
Linux安装BTCPayServer并设置比特币BTC和Lightning支付网关
查看>>
mysql安装,远程连接,以及修改密码
查看>>
Mybatis查询返回Map类型数据
查看>>
java的深拷贝与浅拷贝
查看>>
程序员如何提高工作效率
查看>>
promise
查看>>
将Java应用部署到SAP云平台neo环境的两种方式
查看>>
数据批量导入Oracle数据库
查看>>
调用lumisoft组件发邮件 不需要身份验证 不需要密码
查看>>
DW 正则
查看>>
抓屏原理
查看>>
UNIX网络编程读书笔记:TCP输出、UDP输出和SCTP输出
查看>>
扩展 DbUtility (1)
查看>>
iOS开发UI篇—使用picker View控件完成一个简单的选餐应用
查看>>
Hadoop学习笔记系列文章导航
查看>>
SpringMVC中ModelAndView addObject()设置的值jsp取不到的问题
查看>>
Prometheus : 入门
查看>>
使用 PowerShell 创建和修改 ExpressRoute 线路
查看>>
在C#中获取如PHP函数time()一样的时间戳
查看>>