GVKun编程网logo

Linux下onvif客户端获取ipc摄像头 GetStreamUri:rtsp地址(h264、h265)

28

关于Linux下onvif客户端获取ipc摄像头GetStreamUri:rtsp地址和h264、h265的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于actionscript-3–如何

关于Linux下onvif客户端获取ipc摄像头 GetStreamUri:rtsp地址h264、h265的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于actionscript-3 – 如何在NetStream中打开和关闭H264?、Android6.0 dump h264/h265编码裸流(二)、Chrome播放海康威视大华华为摄像头RTSP流,不需转码转流,延迟毫秒级,支持多路播放、H.264/H.265、FFmpeg h264转h265命令等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

Linux下onvif客户端获取ipc摄像头 GetStreamUri:rtsp地址(h264、h265)

Linux下onvif客户端获取ipc摄像头 GetStreamUri:rtsp地址(h264、h265)

GetStreamUri:rtsp地址

鉴权:但是在使用这个接口之前是需要鉴权的。ONVIF协议规定,部分接口需要鉴权,部分接口不需要鉴权,在调用需要鉴权的接口时不使用鉴权,会导致接口调用失败。实现鉴权的方式之一可以调用gSOAP源码中的 soap_wsse_add_UsernameTokenDigest()函数。要安装依赖库OpenSSL

实现代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#include "soapH.h"
#include "stdsoap2.h"
#include "soapStub.h"
#include "wsseapi.h"

#include "wsdd.nsmap" //命名空间

static struct soap* ONVIF_Initsoap(struct SOAP_ENV__Header *header, const char *was_To, const char *was_Action, int timeout)
{
    struct soap *soap = NULL;    // soap环境变量
    unsigned char macaddr[6];
    char _HwId[1024];
    unsigned int Flagrand;

    soap = soap_new();
    if(soap == NULL)
    {
        printf("[%d]soap = NULL\n", __LINE__);
        return NULL;
    }

    soap_set_namespaces(soap, namespaces);   // 设置soap的namespaces,即设置命名空间

    // 设置超时(超过指定时间没有数据就退出)
    if(timeout > 0)
    {
        soap->recv_timeout = timeout;
        soap->send_timeout = timeout;
        soap->connect_timeout = timeout;
    }
    else
    {
        //Maximum waittime : 20s
        soap->recv_timeout  = 20;
        soap->send_timeout  = 20;
        soap->connect_timeout = 20;
    }

    soap_default_SOAP_ENV__Header(soap, header);

    //Create SessionID randomly,生成uuid(windows下叫guid,linux下叫uuid),格式为urn:uuid:8-4-4-4-12,由系统随机产生
    srand((int)time(0));
    Flagrand = rand()%9000 + 8888;
    macaddr[0] = 0x1;
    macaddr[1] = 0x2;
    macaddr[2] = 0x3;
    macaddr[3] = 0x4;
    macaddr[4] = 0x5;
    macaddr[5] = 0x6;
    sprintf(_HwId, "urn:uuid:%ud68a-1dd2-11b2-a105-%02X%02X%02X%02X%02X%02X", Flagrand, macaddr[0], macaddr[1], macaddr[2],macaddr[3],macaddr[4],macaddr[5]);
    header->wsa__MessageID = (char *)malloc(100);  
    memset(header->wsa__MessageID, 0, 100);
    strncpy(header->wsa__MessageID, _HwId, strlen(_HwId));    //wsa__MessageID存放的是uuid

    if(was_Action != NULL)
    {
        header->wsa__Action = (char*)malloc(1024);
        memset(header->wsa__Action, ''\0'', 1024);
        strncpy(header->wsa__Action, was_Action, 1024); //
    }
    if(was_To != NULL)
    {
        header->wsa__To = (char *)malloc(1024);
        memset(header->wsa__To, ''\0'', 1024);
        strncpy(header->wsa__To, was_To, 1024);//"urn:schemas-xmlsoap-org:ws:2005:04:discovery";
    }
    soap->header = header;
    return soap;
}


//释放函数
void ONVIF_soap_delete(struct soap *soap)
{
    soap_destroy(soap);                      // remove deserialized class instances (C++ only)
    soap_end(soap);                          // Clean up deserialized data (except class instances) and temporary data
    soap_free(soap);                         // Reset and deallocate the context created with soap_new or soap_copy
}


//鉴权
static int ONVIF_SetAuthInfo(struct soap *soap, const char *username, const char *password)
{
    int result = 0;
    if((NULL != username) || (NULL != password)){
        soap_wsse_add_UsernameTokenDigest(soap, NULL, username, password);
    }else{
        printf("un etAuth\n");
        result = -1;
    }

    return result;
}



int main(int argc,char *argv[])
{
    int i = 0;
    int ret = 0;
    char media_addr[] = "http://172.168.0.211/onvif/media_service"; //GetCapabilities得到的地址
    char media_addr2[] = "http://172.168.0.211/onvif/media2_service"; //GetServices得到的地址
    char taken[] = "Profile000";   //get_profiles获取    
    struct SOAP_ENV__Header header;
    
    struct soap* soap = ONVIF_Initsoap(&header, NULL, NULL, 5);

    //...............................................h264通道....................................................
    struct _trt__GetStreamUri trt__GetStreamUri;
    struct _trt__GetStreamUriResponse response;
    trt__GetStreamUri.StreamSetup = (struct tt__StreamSetup*)soap_malloc(soap, sizeof(struct tt__StreamSetup));
    if (NULL == trt__GetStreamUri.StreamSetup){
        printf("soap_malloc is error\n");
        ret = -1;
    }

    trt__GetStreamUri.StreamSetup->Stream = tt__StreamType__RTP_Unicast;//stream type
    trt__GetStreamUri.StreamSetup->Transport = (struct tt__Transport *)soap_malloc(soap, sizeof(struct tt__Transport));
    if (NULL == trt__GetStreamUri.StreamSetup->Transport){
        printf("soap_malloc is error\n");
        ret = -1;
    }

    trt__GetStreamUri.StreamSetup->Transport->Protocol = 1;
    trt__GetStreamUri.StreamSetup->Transport->Tunnel = 0;
    trt__GetStreamUri.StreamSetup->__size = 1;
    trt__GetStreamUri.StreamSetup->__any = NULL;
    trt__GetStreamUri.StreamSetup->__anyAttribute = NULL;
 
    trt__GetStreamUri.ProfileToken = (char *)soap_malloc(soap, 128*sizeof(char ));//
    if (NULL == trt__GetStreamUri.ProfileToken){
        printf("soap_malloc is error\n");
        ret = -1;
    }
    strcpy(trt__GetStreamUri.ProfileToken, taken);
    ONVIF_SetAuthInfo(soap,"admin","123456");  //鉴权
    soap_call___trt__GetStreamUri(soap, media_addr, NULL, &trt__GetStreamUri, &response);
    if(soap->error){ 
        ret = -1;
        printf("soap error: %d, %s, %s\n", soap->error, *soap_faultcode(soap), *soap_faultstring(soap));
        return ret;
    }else{
        printf("rtsp_addr: %s\n", response.MediaUri->Uri);
    }
    //...............................................h264通道....................................................


 /* //...............................................h265通道....................................................
    struct _tr2__GetStreamUri tr2__GetStreamUri;
    struct _tr2__GetStreamUriResponse tr2__GetStreamUriResponse;
    tr2__GetStreamUri.Protocol = (char *)soap_malloc(soap, 128*sizeof(char));//
    if (NULL == tr2__GetStreamUri.Protocol){
        printf("soap_malloc is error\n");
        ret = -1;
    }

    tr2__GetStreamUri.ProfileToken = (char *)soap_malloc(soap, 128*sizeof(char ));//
    if (NULL == tr2__GetStreamUri.ProfileToken){
        printf("soap_malloc is error\n");
        ret = -1;
    }

    strcpy(tr2__GetStreamUri.Protocol, "tcp");
    strcpy(tr2__GetStreamUri.ProfileToken, taken);
    ONVIF_SetAuthInfo(soap,"admin","123456");  //鉴权
    soap_call___tr2__GetStreamUri(soap, media_addr2, NULL, &tr2__GetStreamUri, &tr2__GetStreamUriResponse); 
    if(soap->error){ 
        ret = -1;
        printf("soap error: %d, %s, %s\n", soap->error, *soap_faultcode(soap), *soap_faultstring(soap));
        return ret;
    }else{
        printf("rtsp_addr: %s\n", tr2__GetStreamUriResponse.Uri);
    }*/
    //...............................................h265通道....................................................

    ONVIF_soap_delete(soap);
    return ret;
}

ps:一般情况是如果一开始用的是_tr2(h265),那么获取信息的时候应该就会一直用tr2(h265)通道。但是有些摄像头比较奇葩,一开始走的都是_tr2,也就是h265的通道(如get_profiles),但是在获取onvif的uri(rtsp地址)的时候本该走_tr2(h265)通道,却走了_trt(h264)的通道才能获取,我这个摄像头就是如此。

当然有些h265的摄像头走的是trt(h264)通道,并不会用到_tr2(h265)的通道。

编译:gcc -o test get_Uri_test.c stdsoap2.c soapC.c md5.c dom.c mecevp.c smdevp.c threads.c wsaapi.c wsseapi.c soapClient.c -I import/ -DWITH_OPENSSL -lssl -lcrypto -ldl -pthread

结果:

actionscript-3 – 如何在NetStream中打开和关闭H264?

actionscript-3 – 如何在NetStream中打开和关闭H264?

请使用以下代码:

m_h264Settings = new H264VideoStreamSettings();
<some configuration in between>
m_ns.videoStreamSettings = m_h264Settings;

什么是切换m_ns的videoStreamSettings是否仍在使用H264的好方法?

我尝试在NetStreams(http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetStream.html)的主要文档中查找属性videoStreamSettings,Adobe显然跳过了那个小细节.我知道如何在应用程序的整个执行过程中有效地控制NetStream是使用H264还是“默认”,但我希望能够不断点击按钮使其来回切换,而无需更换NetStream或做任何事情别的疯了.

这怎么做得好?谢谢!

解决方法

阅读你的问题似乎有一些问题你的问题加上一点澄清会有所帮助所以我会做一些假设来尝试回答:

问题1:

What’s a decent way to toggle whether m_ns’s videoStreamSettings are
still using H264 or not?

默认情况下,您是指使用On2 VP6视频编解码器,因此发布为FLV格式而不是F4V?

我假设您的查询与正在播放已发布流的连接应用程序有关?显然,您可以使用变量来跟踪您在录制应用程序本身中应用于流的设置.

我将假设您有一个单独的应用程序正在摄取已发布的流,并且您只是尝试确定是使用H264而不是On2 VP6来发布流.首先文件类型不同,一个是FLV,一个是F4V.其次,您可以在发布时利用为流分配元数据:

protected function sendMetadata():void {
    var MetaData:Object = new Object();
    MetaData.codec = stream.videoStreamSettings.codec;
    MetaData.profile = m_h264Settings.profile;
    MetaData.level = m_h264Settings.level;
    MetaData.hasMetadata = true;
    stream.send("@setDataFrame","onMetaData",MetaData);
}

在回放应用程序中,您可以使用onMetaData()回调来获取所需的信息:

public function onMetaData(infoObject:Object):void {}

问题2:

I want to be able to keep clicking a button to make it switch back and
forth,without replacing the NetStream or doing anything else crazy
like that.

我建议重新连接例程切换您的设置以取消发布现有流并重新连接相机并发布具有不同视频设置的新流.这将保持流的完整性,说实话,不发布和重新发布流并不像你说的那么疯狂.

如果您必须沿着切换设置的路线走下去,那么我上面假设您声明为默认设置将阻止更改已发布流的文件格式.

我个人不会使用相同的编解码器并应用不同的
H264VideoStreamSettings中期发布一个流. H264VideoStreamSettings仅在将摄像机添加到流中时进行验证,并在压缩开始后应用.我的理解是压缩开始于流的发布,以便切换,因为你建议你将在已经发布的流上搞乱压缩.由此产生的流将导致我认为太多的波动,我很难理解为什么这是必要的.但是,我可能会被纠正,或者可能是出于测试目的.

这是完全未经测试的,但您可以创建相机实例,应用您的videoStreamSettings,将相机附加到您的流实例,然后发布.虽然它是发布以切换设置,但您可以从网络流中分离您的相机实例:

stream.attachCamera(null);

然后只需创建一个新的摄像头实例,应用新的videoStreamSettings,最后将其附加到已发布的流.

我通常在收到状态事件“NetStream.Publish.Start”时发送元数据.只要流正在发布,您就必须对此进行修改并在每次将摄像机重新连接到流时重新发送.我不知道这会带来什么影响,但是你的连接播放器应该有希望收到有关元数据更改的回调.

Android6.0 dump h264/h265编码裸流(二)

Android6.0 dump h264/h265编码裸流(二)

1.dump h264/h265的NALU(VPS/SPS/PPS)与数据
路径:frameworks/av/media/libstagefright/MPEG4Writer.cpp

<1>.dump vps/sps/pps to /data/dump_data.h264 file
status_t MPEG4Writer::Track::makeHEVCCodecSpecificData(const uint8_t *data, size_t size) {                                                                                                                                                                                                                                                                                                                                                                         
  ALOGE("makeHEVCCodecSpecificData [ size = %zu ]", size);                                                                                                                                            
  if (mCodecSpecificData != NULL) {                                                                                                             

Chrome播放海康威视大华华为摄像头RTSP流,不需转码转流,延迟毫秒级,支持多路播放、H.264/H.265

Chrome播放海康威视大华华为摄像头RTSP流,不需转码转流,延迟毫秒级,支持多路播放、H.264/H.265

一、背景:

在遍地都是摄像头的今天,往往需要在各种信息化、数字化、可视化B/S系统中集成实时视频流播放等功能,海康、大华、华为等厂家摄像头或录像机等设备一般也都遵循监控行业标准,支持国际标准的主流传输协议RTSP输出,而Chrome、Firefox、Edge等新一代浏览器从2015年开始取消了NPAPI插件技术支持导致不再支持RTSP的原生播放,对于绝大部分没有视频处理经验的前后端工程师来说是一个非常头疼的问题,而对做B/S系统集成的公司来说,为了这一个模块的功能单独招聘专职研发人员来负责的话,成本高昂不说,还未必做的好。

二、方案:

目前网上有两种所谓无插件方案,即后端转码前端播放的方法和后端转流前端转码的方案,虽然无插件播放方案能够播放出画面,但是往往延迟很高,基本上都在数秒之久,在一些对延迟敏感的场合客户要求毫秒级延迟,显然无插件技术方案是无法满足的;而且首屏画面显示慢,基本上得十几秒,这就导致切换播放源时迟迟看不到画面出来,用户体验很差;况且无插件技术方案,需要在后端持续运行高负荷运转的视频转码转流服务,如果摄像头路数多或需要在线播放的终端比较多,服务器的压力就会很大,播放卡顿、花屏、黑屏、断播等现象就会时常出现,很难让客户满意,为了解决这些问题,相关硬件、软件的投入和持续不断的带宽占用往往也让客户难以接受。现在越来越多的客户追求高大上的视频播放效果,采用高清摄像头的越来越多,播放显示器1080P已是低配,2K甚至4K大屏正在成为主流之选。这种无插件技术方案,在中高配的屏幕上如果只能播放出慢如蜗牛的画面,想不让客户吐槽实在是太难了。

三、难点:

一个好的视频流网页播放方案,首先要能做到持续稳定播放多路视频,需同时支持H.264和H.265编码,最核心的还是要做到低延迟、切换画面快,另外就是对当前主流版本的浏览器兼容能力要强,还有就是开发接口丰富并可定制,如果还能做到开源或采用一些免费开源的播放引擎,那就最好不过了,毕竟开源在商业领域的应用越来越多,是个大趋势,从系统集成商的角度来说,开源意味着有更多的自主可控机会来降低整个系统的实施风险。

四、突破:

猿大师针对当前行业痛点,经历数年研发出了具有专利保护技术的猿大师中间件产品,在浏览器之上重新搭建了一套外接程序系统并可无缝嵌入浏览器网页运行,成功模拟了2015年之前Chrome、Firefox、IE等浏览器支持的ActiveX控件和NPAPI插件技术运行效果。

猿大师中间件免费体验地址:http://www.yuanmaster.com/xia...

五、优势:

1. 低延迟播放

猿大师VLC播放程序基于基于VLC的ActiveX控件开发,完整封装了控件的所有接口给前端调用,在同等条件下,延迟时间和VLC桌面程序播放保持一致,并可支持多路播放。可充分利用终端电脑硬件加速(GPU)能力,在同等硬件和网络条件下,延迟可做到毫秒级,可播放更多视频源、支持更高的分辨率、实现更流畅的播放效果,网络上所谓的无插件方案完全不能与之相比。

2. 兼容性强

  1. 绝大部分浏览器兼容,同时兼容Chrome、Edge、Firefox、IE、Opera、360、QQ等浏览器的低版本到最新版都可以使用;
  2. 设备兼容性强,同时支持海康、大华、宇视、华为等厂家的硬件设备,只要能输出RTSP、RTMP、HLS、HTTP、TCP、UDP等流媒体协议,就可以直接播放;
  3. 支持多种视频编码方式,不管是H.264还是H.265都可以同时支持播放,在一些采用WASM的无插件技术方案中,往往只支持H.265编码的视频流,服务器转码方案中,编码兼容能力直接依赖这个转码服务的实现;
  4. 几乎能播放任何内容,依托开源的VLC著名播放引擎,支持文件、光盘、摄像头、设备及流媒体可直接播放MPEG-2, MPEG-4, H.264, H.265, MKV, WebM, WMV, MP3, MP4等文件,而无插件技术方案往往能播放的内容有限,比如不支持本地文件播放,不支持高速播放;
  5. 分辨率支持范围广,从480P到1080P,还是更高的2K或4K,都能轻松应对,无插件方案从1080P开始,播放效果基本上就差强人意了。

3. 功能丰富

  1. 最核心的无疑是播放功能,包含单路播放、多路播放、全屏播放、快播、慢播等等,其中多路播放分屏风格支持多达26种,总有一款适合您,没有需要的分屏风格时也可以委托定制开发,还有指定视频名称或指定时间段回看视频等;
  2. 抓图功能,定时批量抓、支持保存指定本地路径或图片数据直接返回前端、图片质量可控制等,无插件方案由于无法访问本地文件系统是无法抓图直接保存到本地的,也不是基于视频原有分辨率进行抓取,图片质量无法保证;
  3. 录像功能,支持直接录像保存到本地MP4文件,而无插件方案由于无法访问本地文件系统,自然也无法直接完成此功能;
  4. 弹幕及水印功能,播放状态实时提示等支持,无插件方案基本只能在服务器端先行添加,无法针对终端区别对待;
  5. 语音对讲及云台控制,无插件方案基本无此功能;
  6. 人脸识别、车牌识别并显示画框等个性化功能,可通过定制设备厂家原生SDK功能实现。

4. 可定制

猿大师的网页播放小程序的播放分屏风格、中间件产品名称及公司信息等,接受付费定制开发使用,实现个性化的播放效果。

5. 开源

猿大师的网页播放小程序,主要是基于著名开源播放引擎LibVLC开发,视频播放模块后续服务有保障,播放小程序本身也支持客户付费获得源码后自行再定制开发,实现源代码级别的自主可控。因为基于视频画面定制实现一些其它功能也是常有的,比如人脸识别、车牌识别,识别出来同时需要在画面中加入一些标记元素,也可以设计触发某些条件时自动抓图并保存。

6. 低成本

由于采用终端直接播放的技术方案,无需服务器提供转码转流支持,因此可节省软硬件投入成本和持续的带宽占用成本。

7. 简单可靠

延续原有插件播放技术路线,可实现平滑升级,前后端改造小,提供VUE集成范例,集成简单,节省成本。

1.猿大师与大华官方网页延迟对比:https://www.bilibili.com/vide...
https://www.bilibili.com/vide...
2.猿大师VLC播放程序与海康威视官方网页延迟对比:https://www.bilibili.com/vide...
https://www.bilibili.com/vide...
3.猿大师同时播放25路RTSP流效果:https://www.bilibili.com/vide...
https://www.bilibili.com/vide...

FFmpeg h264转h265命令

FFmpeg h264转h265命令

1.裸流之间的转换
# ffmpeg -i test.h264 test.hevc

2.MO4封装h264转换到h265
# ffmpeg -i input.mp4 -c:v libx265 output.mp4 

 

今天的关于Linux下onvif客户端获取ipc摄像头 GetStreamUri:rtsp地址h264、h265的分享已经结束,谢谢您的关注,如果想了解更多关于actionscript-3 – 如何在NetStream中打开和关闭H264?、Android6.0 dump h264/h265编码裸流(二)、Chrome播放海康威视大华华为摄像头RTSP流,不需转码转流,延迟毫秒级,支持多路播放、H.264/H.265、FFmpeg h264转h265命令的相关知识,请在本站进行查询。

本文标签: