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

概述下载并安装FFMPEG下载并安装mediamtx开启mediamtx使用FFMPEG进行视频推流使用http方式播放视频mediamtx部分使用FFMPEG进行视频推流(重点)文末关于Java执行FFMPEG推送命令补充

概述

使用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的命令行说明

文末

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

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

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

关于Java执行FFMPEG推送命令

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

搜索 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

好文链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: