用java如果把rtmp流里的音频流解析出来用?

ywydc123 2019-06-13 02:39:18
业务就是有一个rtmp的直播流,我要从代码里头把这个流的音频流解析出来拿给翻译api来翻译成文字,请问这个音频流怎么取出来?
目前看到的就是javacv解析可以解出来,但是写出来好像没啥用。
...全文
4302 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2021-05-08
  • 打赏
  • 举报
回复
引用 楼主 ywydc123 的回复:
业务就是有一个rtmp的直播流,我要从代码里头把这个流的音频流解析出来拿给翻译api来翻译成文字,请问这个音频流怎么取出来? 目前看到的就是javacv解析可以解出来,但是写出来好像没啥用。
引用 楼主 ywydc123 的回复:
业务就是有一个rtmp的直播流,我要从代码里头把这个流的音频流解析出来拿给翻译api来翻译成文字,请问这个音频流怎么取出来? 目前看到的就是javacv解析可以解出来,但是写出来好像没啥用。
最近被这个问题搞得脑壳痛,请问下当时你们怎么解决的呢?
「已注销」 2021-05-08
  • 打赏
  • 举报
回复
引用 1 楼 lihqlihqli 的回复:
你好,我有一个同样的需求,请问这个问题解决了吗
问题解决了吗?我目前也需要这样的场景,请问下当时你们的解决方案是怎样的呢?
程序员的键盘 2020-09-03
  • 打赏
  • 举报
回复
ffmpeg 解码 取A帧
lihqlihqli 2020-08-23
  • 打赏
  • 举报
回复
你好,我有一个同样的需求,请问这个问题解决了吗
基于ffmpeg 进行视频转换 flv\mp4\3gp\wmv等 package cn.fourtwoone.main; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; /** * @author Eoge E-mail:18802012501@139.com * @version 创建时间:2017年6月23日 上午9:13:12 * 类说明 */ public class FfmpegManager { private static ConcurrentMap> handlerMap = new ConcurrentHashMap>(20); private static int checkContentType(String path) { String type = path.substring(path.lastIndexOf(".") + 1, path.length()).toLowerCase(); // ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等) if (type.equals("avi")) { return 0; } else if (type.equals("mpg")) { return 0; } else if (type.equals("wmv")) { return 0; } else if (type.equals("3gp")) { return 0; } else if (type.equals("mov")) { return 0; } else if (type.equals("mp4")) { return 0; } else if (type.equals("asf")) { return 0; } else if (type.equals("asx")) { return 0; } else if (type.equals("flv")) { return 0; } // 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), // 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式. else if (type.equals("wmv9")) { return 1; } else if (type.equals("rm")) { return 1; } else if (type.equals("rmvb")) { return 1; } return 9; } private static boolean checkfile(String path) { File file = new File(path); if (!file.isFile()) { return false; } return true; } protected String getComm4Map(Map paramMap) { // -i:输入地址或者文件绝对地址 StringBuilder comm = new StringBuilder(); if(paramMap.containsKey("fp")) { comm.append(paramMap.get("fp")).append(" -i"); }else comm.append("ffmpeg -i "); // 是否有必输项:输入地址,输出地址,应用名 if (paramMap.containsKey("input") && paramMap.containsKey("output") && paramMap.containsKey("name")) { comm.append(paramMap.get("input")).append(" "); // -f :转换格式,默认flv comm.append(" -f ").append(paramMap.containsKey("fmt") ? paramMap.get("fmt") : "flv").append(" "); // -r :帧率,默认25 comm.append("-r ").append(paramMap.containsKey("fps") ? paramMap.get("fps") : "30").append(" "); // -s 分辨率 默认是原分辨率 comm.append("-s ").append(paramMap.containsKey("rs") ? paramMap.get("rs") : "").append(" "); // -an 禁用音频 comm.append("-an ").append( paramMap.containsKey("disableAudio") && ((Boolean) paramMap.get("disableAudio")) ? "-an" : "") .append(" "); // 输出地址 comm.append(paramMap.get("output")); // 发布的应用名 comm.append(paramMap.get("name")); // 一个视频源,可以有多个输出,第二个输出为拷贝源视频输出,不改变视频的各项参数 comm.append(" ").append(" -vcodec copy -f flv -an rtmp://192.168.30.21/live/test2"); System.out.println(comm.toString()); return comm.toString(); } else { throw new RuntimeException("输入地址不能为空!"); } } public String push(Map paramMap) throws IOException { // 从map里面取数据,组装成命令 String comm = getComm4Map(paramMap); ConcurrentMap resultMap = null; // 执行命令行 final Process proc = Runtime.getRuntime().exec(comm); System.out.println("执行命令----start commond"); OutHandler errorGobbler = new OutHandler(proc.getErrorStream(), "Error"); OutHandler outputGobbler = new OutHandler(proc.getInputStream(), "Info"); errorGobbler.start(); outputGobbler.start(); // 返回参数 resultMap = new ConcurrentHashMap(); resultMap.put("info", outputGobbler); resultMap.put("error", errorGobbler); resultMap.put("process", proc); String key = paramMap.hashCode()+""; handlerMap.put(key, resultMap); return key; } public void removePush(String pushId) { if (handlerMap.containsKey(pushId)) { ConcurrentMap map = handlerMap.get(pushId); //关闭两个线程 ((OutHandler)map.get("error")).destroy(); ((OutHandler)map.get("info")).destroy(); System.out.println("停止命令-----end commond"); //关闭命令主进程 ((Process)map.get("process")).destroy(); handlerMap.remove(pushId); } } public class OutHandler extends Thread { // 控制线程状态 volatile boolean status = true; BufferedReader br = null; String type = null; public OutHandler(InputStream is, String type) { br = new BufferedReader(new InputStreamReader(is)); this.type = type; } /** * 重写线程销毁方法,安全的关闭线程 */ @Override public void destroy() { status = false; } /** * 执行输出线程 */ @Override public void run() { String msg = null; try { while (status) { if ((msg = br.readLine()) != null) { System.out.println(type + "消息:" + msg); } } } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { FfmpegManager pusher = new FfmpegManager(); Map map=new HashMap(); map.put("fp", "D:/Program Files/ffmpeg/bin/ffmpeg"); map.put("name", "test3"); map.put("input", "rtsp://admin:admin@192.168.2.236:37779/cam/realmonitor?channel=1&subtype=0"); map.put("output", "rtmp://192.168.30.21/live/"); map.put("fmt", "mp4"); map.put("fps", "25"); map.put("rs", "640x360"); map.put("disableAudio", true); try { // 推送后会获得该处理器的id,通过该id可关闭推送 String id = pusher.push(map); Thread.sleep(100000); // 关闭推送 pusher.removePush(id); } catch (Exception ee) { ee.printStackTrace(); } } }

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧