首页 > 编程知识 正文

前置摄像头推上去的手机,如何地推

时间:2023-05-03 15:31:40 阅读:43925 作者:671

欢迎来到我的GitHub。 对危机溪流进行分类和总结的原件(包括源代码) https://github.com/zq 2599/blog _ demos

本篇概要正文是《JavaCV的摄像头实战》的第五篇,一起考虑问题吧。 本地摄像头的内容怎么能给网上的其他人看? 这与推动流有关。 如下图所示,基于JavaCV的APP应用程序将相机的视频帧推送至媒体服务器,观众通过播放器软件远程连接至媒体服务器,即可看到相机的内容。

今天的主要工作是开发上图中的javacv APP应用程序并验证功能是否正常。在《JavaCV的摄像头实战之一:基础》文章中创建的简单gra B- push项目中,父类AbstractCameraApplication是继续使用此项目,在创建子类之前检查父类的基础结构,因为粗体是父类定义的每个方法,而红色块需要创建子类才能实现抽象方法,如下图所示

新文件RecordCamera.java。 这是AbstractCameraApplication的子类,代码很简单。 按照上图的顺序说明在《JavaCV的摄像头实战之一:基础》上部署了媒体服务器。 在此处,将媒体服务器的推送地址定义为成员变量。 请根据自己的情况调整。 privatestaticfinalstringrecord _ address=' rtmp ://192.168.50.4:21935/HLS/camera '; 另外,还可以提供成员变量,以便在推送流时向帧添加时间戳。 protectedlongstartrecordtime=0l; 将视频帧推送至媒体服务器的功能来自FrameRecorder。 这是一个抽象类,本篇使用其子类FFmpegFrameRecorder,因此定义了FrameRecorder类型的成员变量。 //帧记录器受保护的帧记录器记录器; 接下来是初始化操作。 请注意各参数的设定(1280*720分辨率相机时)。 @ overrideprotectedvoidinitoutput ) ) throwsexception(/实例化FFmpegFrameRecorder SRS的推送地址为recorder=framerecorder.crrr 要降低//启动时的延迟,请参阅//https://TRAC.ffmpeg.org/wiki/streaming guide (recorder.setvideooption )、' zerolatency ' ) //在视频质量和编码速度之间选择适合自己的方案。 包括这些选项。 //ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、 very slow//ultrafastoffersustheleastamountofcompression (lower encoder//CPU ) atthecostofalargerstreamsize/at the other veryslowprovidesthebestcompression (high//encoder CPU ) whileloweringthestreamsize/(see :3https://TRAC.ffmpeg ultrafast是CPU消耗最少的recorder.setvideooption (' preset ',' ultrafast ); //constantratefactor (see :3359 TRAC.ffmpeg.org/wiki/encode/h.264 ) recorder.setvideoption('crf ',' ccode ) //编码格式recorder.setvideocodec (av codec.av _ codec _ id _ h264 ); 设置名为//recorder.setformat(flv )的包格式; //fps (帧间隔)//每秒帧数recorder.set frame rate (获取帧速率) ); //Key frame interval,inourcaseevery2seconds-30(fps ) * 2=60

// 关键帧间隔 recorder.setGopSize((int)getFrameRate()*2); // 帧录制器开始初始化 recorder.start(); } 接下来是output方法,关键是recorder.record,另外要注意时间戳的计算和设置: @Override protected void output(Frame frame) throws Exception { if (0L==startRecordTime) { startRecordTime = System.currentTimeMillis(); } // 时间戳 recorder.setTimestamp(1000 * (System.currentTimeMillis()-startRecordTime)); // 存盘 recorder.record(frame); } 最后是处理视频的循环结束后,程序退出前要做的事情,即关闭帧抓取器: @Override protected void releaseOutputResource() throws Exception { recorder.close(); } 另外还要注意两帧之间的延时,由于推流涉及到网络,因此不能像本地预览那样根据帧率严格计算,实际间隔要更小一些: @Override protected int getInterval() { // 相比本地预览,推流时两帧间隔时间更短 return super.getInterval()/4; } 至此,推流功能已开发完成,再写上main方法,注意参数600表示抓取和录制的操作执行600秒: public static void main(String[] args) { new RecordCamera().action(600); } 运行main方法,等到控制台输出下图红框的内容时,表示已经开始推流:
用本机或局域网内另一台电脑,用VLC软件打开刚才推流的地址rtmp://192.168.50.43:21935/hls/camera,稍等几秒钟后开始正常播放:
还可用VLC的工具查看编码信息:
至此,咱们已完成了推流功能,验证远程播放也正常,得益于JavaCV的强大,整个过程是如此的轻松愉快,接下来请继续关注危机的溪流原创,《JavaCV的摄像头实战》系列还会呈现更多丰富的应用;此刻聪明的您一定发现了问题:只推视频吗?连声音都没有,就这?没错,接下来的实战,咱们该挑战音频处理了 源码下载 《JavaCV的摄像头实战》的完整源码可在GitHub下载到,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos): 名称链接备注项目主页https://github.com/zq2599/blog_demos该项目在GitHub上的主页git仓库地址(https)https://github.com/zq2599/blog_demos.git该项目源码的仓库地址,https协议git仓库地址(ssh)git@github.com:zq2599/blog_demos.git该项目源码的仓库地址,ssh协议这个git项目中有多个文件夹,本篇的源码在javacv-tutorials文件夹下,如下图红框所示:
javacv-tutorials里面有多个子工程,《JavaCV的摄像头实战》系列的代码在simple-grab-push工程下:
你不孤单,危机的溪流原创一路相伴 Java系列Spring系列Docker系列kubernetes系列数据库+中间件系列DevOps系列

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。