rtmp播放器解析接口(视频RTMP推流实践)

对应RTMP推流,业界有很多开源方案。如使用FFMPEG推流,librtmp(rtmp-dump),gstream推流。由于ffmpeg和gstreamer比较庞大,仅仅用来推流,有大炮打蚊子之嫌。针对客户端特别是瘦客户端,使用librtmp(rtm

对应RTMP推流,业界有很多开源方案。如使用FFMPEG推流,librtmp(rtmp-dump),gstream推流。由于ffmpeg和gstreamer比较庞大,仅仅用来推流,有大炮打蚊子之嫌。针对客户端特别是瘦客户端,使用librtmp(rtmp-dump)方案更加精简,更加高效。

本方案基本思路:rtmp播放器解析接口(视频RTMP推流实践)

RTMP视频推流流程

1. 下载并编译librtmp。

下载地址:
http://rtmpdump.mplayerhq.hu/download/

编译后产生一个librtmp.so 库

2. 调用librtmp,封装一个视频层Wrapper_RtmpLib.cpp,该类定义如下:

1class Wrapper_RtmpLib
2
3{
4
5public:
6
7       Wrapper_RtmpLib(char * url);
8
9       ~Wrapper_RtmpLib();
10
11      int Open();
12
13      int SendData(char * data,int dataLength, unsigned int timeStamp,int debug = -1);
14
15      int IsConnect();
16
17      int Close();
18
19private:
20
21     int InitSockets();
22
23     void CleanupSockets();
24
25     int pushSPSPPS(char *sps, int spsLen, char *pps, int ppsLen, int m_stream_id,unsigned int timeStamp);
26
27     int pushVideoData(char *data, int dataLen, bool keyFrame, int m_stream_id,unsigned int timeStamp);
28
29     int GetStartPrixLen(char *Pack, int offest);
30
31     char * rtmpUrl = NULL;
32
33     RTMP * m_pRtmp = NULL;
34
35     NALU * CopyNALU(NALU * src);
36
37     void FreeNALU(NALU * nalu);
38
39};

3. Wrapper_RtmpLib对外提供RTMP推流接口。

基本使用步骤:

1. 定义一个Wrapper_RtmpLib对象test

2. Test.open(),与服务器建立rtmp信令相关连接

3. int SendData(char * data,int dataLength, unsigned int timeStamp,int debug = -1);发送RTMP数据

注意data,必须是一个完整的NAL单元。所以应用程序调该接口前必须解析出NAL单元。

下面是一个h264裸文件推送RTMP过程。

基本思路如下:

读文件—-解析NAL单元—利用 SendData发送一个完成的NAL单元完成推流

编译main.cpp Wrapper_RtmpLib.cpp 并链接librtmp.so生成可执行文件h2642rtmp.rtmp播放器解析接口(视频RTMP推流实践)

编译生成可执行文件

运行可执行程序推流

./h264tortmp avc.h264 rtmp://192.168.1.226:8085/live/1830562240700540100 25

使用该方案注意:

1. SendData 必须是一个完整的NAL单元。如果是文件需要解析或网络流必须解析出NAL单元

2. 时间戳采用间隔时间。即时间戳按每帧时间间隔递增,可能因为网络抖动或者1000/帧率不是帧率会存在累计误差。该demo因为不存在音视频同步,时间戳影响不大。

3.如果是云主机,在云主机内不能推公网IP,而要推内网IP 192.168.1.226,客户端访问需要外网IP。

客户端播放效果如下:rtmp播放器解析接口(视频RTMP推流实践)

RTMP流web端播放效果

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/16150.html

(0)
nan
上一篇 2021-08-21
下一篇 2021-08-21

相关推荐

  • php怎么创建文件夹和文件

    在PHP中,可以使用mkdir()函数来创建文件夹,使用fopen()函数来创建文件。以下是示例代码:创建文件夹:$folderName = “new_folder”;// 创建新文件夹if (!file_exists($folderName)) {mkdir($folderName);echo “文件夹创建成功!”;} else {echo “文件夹已存在!”;}创建文件:$fileNam

    2024-03-17
    0
  • Osprey模型在医疗健康领域的潜在应用有哪些

    医疗影像识别:Osprey模型可以用于医疗影像识别,如X光片、MRI等影像的分析和诊断,帮助医生更准确地判断疾病和制定治疗方案。疾病预测和预防:Osprey模型可以通过患者的个人健康数据和生活习惯,预测患病风险并提出预防措施,帮助人们更好地管理自己的健康。临床决策支持:Osprey模型可以根据患者的病史和临床数据,为医生提供辅助决策支持,帮助医生更快速、准确地做出诊断和治疗方案。医疗资源优化:Os

    2024-05-22
    0
  • 脑白金的广告是如何定位的(脑白金广告传递的定位信息)

    脑白金的广告是如何定位的,脑白金广告传递的定位信息 内容导航: 脑白金广告“今年过节不收礼收礼只收脑白金”家喻户晓问产品定 恒源祥广告为何比脑白金差 你对脑白金广告怎么看 揭秘定向…

    2022-05-20
    0
  • 谷歌为什么经常打不开(谷歌有时候打不开)

    谷歌为什么经常打不开,谷歌有时候打不开内容导航:google为什么打不开了原因为什么谷歌浏览器打不开Google谷歌搜索引擎怎么打不开了Google打不开一、google为什么打不开了原因Google打不开的原因是因为谷歌公司不遵守中国的法律所以自行退出了中国市场,既然公司都

    2022-05-13
    0
  • oracle的case when语句有什么作用

    Oracle的CASE WHEN语句用于在查询中根据条件执行不同的操作。它类似于编程语言中的if-else语句,允许根据给定条件选择不同的结果。CASE WHEN语句可以在SELECT、WHERE、ORDER BY等语句中使用,以根据条件返回不同的结果。通过使用CASE WHEN语句,可以在查询中根据不同的条件生成计算字段或者对结果进行分类、排序等操作。

    2024-05-14
    0
  • hadoop如何修改文件内容

    Hadoop本身并不提供直接修改文件内容的功能,因为Hadoop主要用于分布式存储和处理大数据,而不是文件编辑。但是,可以通过以下方法修改Hadoop中的文件内容:使用Hadoop的HDFS Shell或HDFS API来读取文件内容,修改后再写回到文件中。这种方法需要编写Java代码或使用Hadoop的命令行工具来操作文件。将文件下载到本地,修改后再上传回Hadoop。可以使用hadoop fs

    2024-05-22
    0

发表回复

登录后才能评论