FFMPEG+mediamtx 实现海康相机视频播放

概述

使用FFMPEG对海康相机视频进行读取,重新编码后再进行推流,推到mediamtx,再通过网页播放器或其他客户端拉取视频并播放

下载并安装FFMPEG

随便找的一个安装教程:https://blog.csdn.net/weixin_44704985/article/details/109532224
在这里插入图片描述
安装后需配置到环境变量
在这里插入图片描述

下载并安装mediamtx

https://github.com/bluenviron/mediamtx/releases
要是打不开自己想办法
在这里插入图片描述

开启mediamtx

如果不进行配置文件修改,使用默认配置,双击mediamtx.exe打开执行文件,将有以下效果
在这里插入图片描述

使用FFMPEG进行视频推流

打开cmd 运行以下命令

ffmpeg -re -i 你的视频.mp4 -vcodec libvpx -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream/h1

这句的含义是:输入流为你指定的视频,可以是本地的文件,也可以是海康的rtsp视频流,如

ffmpeg -re -i rtsp://admin:hik12345@10.16.4.25:554/Streaming/Channels/101 -vcodec libvpx -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream/h1

输出流是 rtsp://127.0.0.1:8554/stream
将原视频格式重新编码为libvpx(p8)格式

将会是以下效果
在这里插入图片描述
而此时查看mediamtx执行窗口会有以下效果
在这里插入图片描述

使用http方式播放视频

在网页中运行以下url
http://127.0.0.1:8889/stream/h1
在这里插入图片描述
如果不出意外现在能够进行视频播放,下面进行一些补充讲解。

mediamtx部分

在这里插入图片描述
我们可以看见,开启软件后会对RTSP、RTMP、HLS、WebRTC、SRT这几种协议类型输入流进行监听
可以通过ffmpeg将视频推送到对应协议的端口

使用FFMPEG进行视频推流(重点)

ffmpeg -re -i 你的视频.mp4 -vcodec libvpx -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream/h1

编码时可以设置参数,vcodec:视频编码格式,acodec:音频编码格式
格式有很多,可以使用以下方式查看具体编码格式

ffmpeg -encoders

在这里插入图片描述
这里我把输入视频转换为libvpx格式是因为我想直接使用http方式播放视频,而WebRTC只能支持几种格式视频播放

如果你想同时推送多个相机或视频源,可以修改输出路径,如:
rtsp://127.0.0.1:8554/stream/h1
rtsp://127.0.0.1:8554/stream/h2
rtsp://127.0.0.1:8554/stream/h3
。。。
如果是需要推送其他协议视频,请参考ffmpeg的命令行说明

文末

如果上面都成功了,那么现在你需要做以下几件事:

  1. 学习mediamtx的配置文件中各项内容的含义
  2. 学习FFMPEG的各命令以及含义
  3. 多进行尝试

请一定要耐心,最好的方式是浏览各平台官网

关于Java执行FFMPEG推送命令

组件地址: https://github.com/kokorin/Jaffree

  1. 搜索 com.github.kokorin.jaffree 标签,并引入依赖

https://developer.aliyun.com/mvn/guide

在这里插入图片描述
2. 示例代码

public class Test {
   public static void main(String[] args) {
       final AtomicLong durationMillis = new AtomicLong();
       //异步方式执行,别忘了把ffmpeg加入到环境变量
       FFmpegResultFuture fFmpegResultFuture = FFmpeg.atPath()
               .addInput(
                       UrlInput.fromUrl("G:\\迅雷下载\\电影\\黑社会.2005.BD1080p.国粤双语中字.mp4")
               )
               .addArguments("-vcodec", "libvpx")
               .addArguments("-rtsp_transport", "tcp")
               .addArguments("-f", "rtsp")
               .addOutput(UrlOutput.toUrl("rtsp://127.0.0.1:8554/stream/h1"))
               .executeAsync();
       try {
           Thread.sleep(1000 * 60);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       //释放资源
       fFmpegResultFuture.graceStop();
       System.out.println("Exact duration: " + durationMillis.get() + " milliseconds");
   }
   }

补充

使用FFMPEG拉取海康相机时视频出错:

Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly

报错命令:

ffmpeg -re -i rtsp://admin:ch123456@192.168.1.64:554/h264/ch1/main/av_stream -vcodec libvpx -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream/h1

查询后了解为视频缺少时间戳,解决方式:

增加参数: -fflags +genpts
ffmpeg -fflags +genpts -i rtsp://admin:ch123456@192.168.1.64:554/h264/ch2/main/av_stream -c copy -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream/h1

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值