FFmpeg 代码实现流媒体推流(RTSP)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FFmpeg 代码实现流媒体推流(RTSP)相关的知识,希望对你有一定的参考价值。

参考技术A

最近需要做实时录屏并把视频推流到RTSP服务器,具体流程是抓取屏幕内容(bitmap),并把bitmap转化为YUV,接着把YUV编码成H264,再把H264码流推到RTSP服务器;把采集到的PCM编码为AAC,再把AAC推流至RTSP服务器。

看了雷神的一篇文章: 最简单的基于FFmpeg的推流器(以推送RTMP为例) ,他是把本地的视频文件推流至RTMP服务器,并不符合我的要求。
接着我找到另一篇文章: ffmpeg实现H264压缩并且推流至RTSP ,这篇文章只有图像编码,并没有音频编码,并且推流之后并没有播放成功。
我综合上面两位大佬的思路,和查找一些资料实现了这个功能。

RTSP服务器使用的是 HappyTime 的免费试用版本。

我抓到的bitmap是BGRA格式的,所以使用的图像格式是 AV_PIX_FMT_BGRA cropImage 是含有rgba图像的数组

调用:

由于我是实时抓取的屏幕, frame_yuv->pts 设为当前的时间戳,以保证能正常播放。

调用:

调用:
其中pcm_buff是包含pcm数据的数组

使用udp传输时传到1400多帧就断开链接了,原因不明,所以改用使用tcp协议传输

延迟有1.5秒左右

参考:
https://blog.csdn.net/leixiaohua1020/article/details/39803457
https://blog.csdn.net/yunge812/article/details/79345584
https://trac.ffmpeg.org/wiki

流媒体服务海康摄像头RTSP视频推流转码拉流直播综合应用:VLC+FFMPEG+Nginx实现RTSP到RTMP网页直播

文章目录

前言

前几章节已完成推流拉流转码直播相关的基础工作准备,本章节整体演示综合直播应用,延迟5秒钟左右…

一、前几章节回顾

二、操作步骤

1、准备本地视频

准备本地视频用于推流: 暗战2.mp4

2、获取海康RTSP视频流

  • 海康RTSP视频流地址:rtsp://admin:1234qwer@192.168.0.128:554/h264/ch1/main/av_stream

3、FFMPEG:转码推流服务准备

4、Nginx:网站服务准备

5、FFMPEG推流:rtsp转rtmp

  • cmd 执行命令:ffmpeg -i “rtsp://admin:1234qwer@192.168.0.64:554/h264/ch1/main/av_stream” -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/live/movie
  • 看到如下界面表示成功:
  • cmd 打开另外要给窗口:ffplay.exe rtmp://localhost:1935/live/movie
  • 看到如下窗口表示成功:

6、FFMPEG推流:rtsp转hls

  • cmd执行如下命令:ffmpeg -i “rtsp://admin:1234qwer@192.168.0.64:554/h264/ch1/main/av_stream” -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/hls/movie
  • 看到如下窗口表示成功:
  • cmd 打开新窗口:ffplay.exe http://localhost:81/hls/movie.m3u8
  • 看到如下窗口表示成功:
  • 此时Nginx网站根目录下会多出很多视频流文件:
  • 出现的问题:hls实时数据流播放一会儿就卡死了,需要结束掉重新启动 ffplay.exe http://localhost:81/hls/movie.m3u8

三、网页播放视频流

1、准备测试网页:test.html

<html>
<head>
<link href="https://cdn.bootcss.com/dplayer/1.25.0/DPlayer.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<script src="https://cdn.bootcss.com/dplayer/1.25.0/DPlayer.min.js"></script>
</head>
<body>


<div id="dplayer"></div>
<script>
    const dp = new DPlayer(
    container: document.getElementById('dplayer'),
    video: 
        url: 'http://localhost:81/hls/movie.m3u8', /*注意这个为实时视频数据流*/
        type: 'customHls',
        customType: 
            customHls: function(video, player) 
                const hls = new Hls();
                hls.loadSource(video.src);
                hls.attachMedia(video);
            ,
        ,
    ,
);
</script>

</body>
</html>

2、各种浏览器打开test.html测试页面:

四、总结

整体延迟5秒钟左右,赶紧还不错!

以上是关于FFmpeg 代码实现流媒体推流(RTSP)的主要内容,如果未能解决你的问题,请参考以下文章

流媒体服务海康摄像头RTSP视频推流转码拉流直播综合应用:VLC+FFMPEG+Nginx实现RTSP到RTMP网页直播

FFMPEG监控拉流,向流媒体服务器推流

流媒体解码及H.264编码推流

ffmpeg推流及拉流

JavaCV开发详解之rtsp推流实战:rtsp转推到rtsp

利用ffmpeg推流到rtsp,再利用jmpeg在html界面上显示的解决办法