前言:

上一章简单的介绍了javacv并且演示了如何获取本机摄像头:http://blog.csdn.net/eguid_1/article/details/51659578

本章将在上一章的基础上,增加视频推流到流媒体服务器和视频录制的功能;

功能:实现边播放边录制/推流,停止预览即停止录制/推流

提示:

1、本章代码从发布至今测试运行正常,如遇到错误请自觉检查环境配置和jar包问题

2、到目前为止大家遇到的问题100%都是jar包问题,那么如果遇到各种异常和报错,请参照第一条,谢谢

一、开发所依赖的包

javacv.jar,javacpp.jar,ffmpeg.jar,ffmpeg-系统平台.jar,opencv.jar,opencv-系统平台.jar。

其中ffmpeg-系统平台.jar,opencv-系统平台.jar中的系统平台根据开发环境或者测试部署环境自行更改为对应的jar包,比如windows7 64位系统替换为ffmpeg-x86-x64.jar

为什么要这样做:因为ffmpeg-系统平台.jar中存放的是c/c++本地so/dll库,而ffmpeg.jar就是使用javacpp封装的对应本地库java接口的实现,而javacpp就是基于jni的一个功能性封装包,方便实现jni,javacv.jar就是对9个视觉库进行了二次封装,但是实现的功能有限,所以建议新手先熟悉openCV和ffmpeg这两个C/C++库的API后再来看javaCV思路就会很清晰了。

二、代码实现

本功能采用按帧录制/推流,通过关闭播放窗口停止视频录制/推流

注:长时间运行该代码会导致内存溢出的原因是没有及时释放IplImage资源(由于javacv是jni方式调用C,通过这种方式创建的资源无法通过虚拟机的GC来清理内存,需要手动进行释放资源,以防止内存溢出错误)

/**

* 按帧录制本机摄像头视频(边预览边录制,停止预览即停止录制)

*

* @author eguid

* @param outputFile -录制的文件路径,也可以是rtsp或者rtmp等流媒体服务器发布地址

* @param frameRate - 视频帧率

* @throws Exception

* @throws InterruptedException

* @throws org.bytedeco.javacv.FrameRecorder.Exception

*/

public static void recordCamera(String outputFile, double frameRate)

throws Exception, InterruptedException, org.bytedeco.javacv.FrameRecorder.Exception {

Loader.load(opencv_objdetect.class);

FrameGrabber grabber = FrameGrabber.createDefault(0);//本机摄像头默认0,这里使用javacv的抓取器,至于使用的是ffmpeg还是opencv,请自行查看源码

grabber.start();//开启抓取器

OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();//转换器

IplImage grabbedImage = converter.convert(grabber.grab());//抓取一帧视频并将其转换为图像,至于用这个图像用来做什么?加水印,人脸识别等等自行添加

int width = grabbedImage.width();

int height = grabbedImage.height();

FrameRecorder recorder = FrameRecorder.createDefault(outputFile, width, height);

recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); // avcodec.AV_CODEC_ID_H264,编码

recorder.setFormat("flv");//封装格式,如果是推送到rtmp就必须是flv封装格式

recorder.setFrameRate(frameRate);

recorder.start();//开启录制器

long startTime=0;

long videoTS=0;

CanvasFrame frame = new CanvasFrame("camera", CanvasFrame.getDefaultGamma() / grabber.getGamma());

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setAlwaysOnTop(true);

Frame rotatedFrame=converter.convert(grabbedImage);//不知道为什么这里不做转换就不能推到rtmp

while (frame.isVisible() && (grabbedImage = converter.convert(grabber.grab())) != null) {

rotatedFrame = converter.convert(grabbedImage);

frame.showImage(rotatedFrame);

if (startTime == 0) {

startTime = System.currentTimeMillis();

}

videoTS = 1000 * (System.currentTimeMillis() - startTime);

recorder.setTimestamp(videoTS);

recorder.record(rotatedFrame);

Thread.sleep(40);

}

frame.dispose();

recorder.stop();

recorder.release();

grabber.stop();

}

总的来说,我们已经实现了基本的推流器功能,那么需要注意的就是转换那里,不清楚为什么不做转换就不能推送到rtmp流媒体服务器,如果哪位有更好的方案希望可以联系博主,感谢!

3、测试录制功能和推流功能

public static void main(String[] args) throws Exception, InterruptedException, org.bytedeco.javacv.FrameRecorder.Exception {

recordCamera("output.mp4",25);

}

public static void main(String[] args) throws Exception, InterruptedException, org.bytedeco.javacv.FrameRecorder.Exception {

recordCamera("rtmp://192.168.30.21/live/record1",25);

}

视频网站ts流媒体服务器,推送本机视频流到流媒体服务器相关推荐

  1. java服务器推送浏览器_前端如何让服务器主动向浏览器推送数据

    前言 前面我们已经聊了ajax,它的特点是浏览器必须先发起请求,服务器才能给出对应的响应,想一想能不能让服务器主动向浏览器推送数据呢?那么这篇文章我们来聊一聊服务器推送功能. 轮询 假设你现在需要去做 ...

  2. Android 使用mqtt实例,包括接收服务器推送以及上传数据到服务器

    1.最方便的方法,使用dlc的module连接mqtt 步骤.1--导入dlc依赖和module //dlc_mqttmodule implementation project(':garbagere ...

  3. Nginx 学习笔记(十)介绍HTTP / 2服务器推送(译)

    原文地址:https://www.nginx.com/blog/nginx-1-13-9-http2-server-push/ 我们很高兴地宣布,2018年2月20日发布的NGINX 1.13.9支持 ...

  4. 深入了解 cometd的服务器推送技术

    简介:服务器推送技术已经出来一段时间了,业界上也有不少基于这种技术(应该说是设计模式)的开源实现,但是要移植或者说应用到自己的项目上都比较麻烦.Dojo 这样一个大型的 Web2.0 开发框架提供了一 ...

  5. web服务器推送技术

    传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工作.不能满足很多现实应用的需求,譬如: 监控系统:后台硬件温度.电压发生变化: 即时通信系统:其它用户登录.发送信息: 即时报价系统:后台 ...

  6. Web服务器推送信息SSE/WebSocket

    介绍 没有简单,通用的方法来以可接受的性能在Web应用程序中实现服务器到客户端的异步通信. HTTP是客户端-服务器计算模型中的请求-响应协议.为了开始交换,客户端向服务器提交请求.为了完成交换,服务 ...

  7. java服务器推送消息技术

    其实有很多种方式实现服务器推送,它们各有各的优缺点: 1.传统轮询:此方法是利用 HTML 里面 meta 标签的刷新功能,在一定时间间隔后进行页面的转载,以此循环往复.它的最大缺点就是页面刷性给人带 ...

  8. win10消息推送服务器,推送--Win10系统 - Win10系统官方网站

    在 Windows 10 正式发布之后,微软一直保持着大约六个月提供一次"较大功能更新".以及每月至少发布两次累积更新的节奏,以便为用户带来更快的功能和体验改进.两周前,微软宣 [ ...

  9. 服务器推送技术之短轮询、长轮询、SSE和Websocket

    服务器推送技术 服务器推送技术干嘛用?就是让用户在使用网络应用的时候,不需要一遍又一遍的去手动刷新就可以及时获得更新的信息.大家平时在上各种视频网站时,对视频节目进行欢乐的吐槽和评论,会看到各种弹幕, ...

最新文章

  1. UVA 327 Evaluating Simple C Expressions
  2. 系统相关的信息模块: import sys
  3. spring cloud云服务架构 - particle云架构代码结构讲解
  4. bootstrap布局两列或者多列表单
  5. 如何提问问题?--《提问的智慧》再次推荐
  6. 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) - 4.28
  7. jquery读取json文件跨域_跨域方法的若干种方式
  8. mac 安装淘宝镜像 cnpm
  9. ssm基于WEB的房屋出租管理系统的设计与实现161620
  10. 禁忌搜索算法求解 TSP 问题的代码示例
  11. ubuntu为jar创建快捷方式
  12. seLinux的管理
  13. 在线ASCII转换工具
  14. 如何查看手机登录IP地址
  15. 在ARM板上的linux系统中查看进程实际使用物理内存
  16. Java条形码生成-Barcode4j
  17. Windows 下设置自定义域名解析到指定 IP
  18. win10点击任务栏图标无法最小化应用
  19. 〖产品思维训练白宝书 - 核心竞争力篇①〗- 产品经理 的核心竞争力解读
  20. 如何安装Redis?

热门文章

  1. python 爬取电子书_利用Python3爬取下载bookset网站的kindle电子书
  2. html+导航栏+点击下划线,html导航栏点击后出现下划线_【Word教程】教你制作输入文字依然对齐的封面下划线......
  3. Ubuntu 下安装 Yar 扩展遇到的问题以及解决方案
  4. js中整除符号,JavaScript 语法:运算符号
  5. bootstrap-导航条固定在顶部
  6. R----ggplot2包介绍学习--转载
  7. java swing textfield_Java swing里怎么获得TextField手动输入的值?
  8. android如何实现批量删除操作,Android 基于聊天页面如何实现批量转发和批量删除...
  9. 优酷视频上传工具可以试用吗
  10. CSGO地图制作:优化编译时间