libvlc 使用mediaplayer 播放rtsp

2023-05-16

环境  ubuntu18.04 vlc3.0.6源码

从 github上下载的vlc 源码,默认配置,默认编译,用命令

./vlc rtsp://192.168.43.129:10086/stream
竟然无法播放,但是直接./vlc test.mp4  用 修改 vlc.c 里的main函数替换成用 vlm推送rtsp流, 都可行。

现象:

[00007fe66c001670] satip stream error: Failed to setup RTSP session

问题排除 

1: 用wind上的vlc搭建rtsp推流,同时用wind上另一个 vlc播放rtsp ok. (推送端 rtsp正常)

2:ubuntu上关掉防火墙 #ufw  disable   #ufw status (ok已关闭)

3:卸载掉自己编译的vlc ,删除掉 user~.config/vlc  重新用 apt-get install vlc, 安装vlc, 还是老问题,似乎重新安装的过程有些毛病。 目的是使用 默认安装的vlc 执行上述的命令来确认系统网络正常,但是没有达到目的 。

4:直接从源码处查看具体问题。。。。。(头大)

5:用wireshark抓包分析

直接就 setup ,连 option 请求都没有,果然是有问题的。

6 运行源码编译出来的vlc, vlc --list 列举出可以加载的插件模块,发现是没有rtsp的接受端支持的,只有rtsp 发送点播插件。

7.0 configure --help 

默认是不支持 realrtsp的。找到原因了,重新配置源码,./configure --enable-realrtsp --enable-live555。

8.0 不过我的configure 打开live555,configure 是失败的,提示live555不存在或者过老,需要自己更新

9.0 https://wiki.videolan.org/UnixCompile#The_method_for_badly-behaved_distributions 

类似于ubuntu 编译libvlc,你需要下载各种依赖代码的源码,操作方法如上官方介绍 (速度奇慢,还会碰到 从谷歌仓库下载 aom(支持av1的解码开源项目),当然下不到,导致失败)

隔天再次分析出错的信息,上述第4 条,如果上述的配置 ./configure --enable-realrtsp --enable-live555 ,只开启realrtsp而disable-live555 ,也会报错。在access.c文件中的

access_new()

{

 access->p_module = module_need(access, "access", access->psz_name,
                                       true);

//上面输出一下 pszname , 输出结果为 :rtsp,也就要加载一个rtsp的access

//查找一下 

}

所有 描述为 rtsp的模块,并且能力为access的,有:

1.0 access/rtsp/access.c  2.0 access/live555.cpp 3.0 access/satip.c

上述wireshark抓包只有一个 setup的,就是匹配到 satip.c模块,出错,然后继续匹配 到 access/rtsp/access.c,结果这个模块发生未知错误加载失败,猜测这个可能已经抛弃,使用的 live555,但是这里没有。。。。。。

安装live555, 上面第9条,vlc官方提供的方法,但是安装又有问题,头文件找不到,编译不过,干脆自行下载一个live555, 

http://www.live555.com/liveMedia/public/

#cd live

#./genMakefiles linux-64bit

#make

#make install

如果不行,手动拷贝一下上面的make install 中安装的文件到 contrib/x86_64-linux-gnu/

嫌麻烦可以 export DESTDIR =XXXanzhuangmulu

#make install

最终程序:

正常安装好live555, 在vlc顶层目录下 重新配置 ./configure --enable-realrtsp --enable-live555  ,执行编译 #make

使用./vlc rtsp://192.168.43.129:10086/stream  播放pc端vlc搭建的服务器rtsp流,播放ok!

环境就绪,现改用mediaplayer 播放rtsp。

在 bin/vlc.c 源码vlc入口函数,用我们自己的 main函数来替换掉源码的main函数,这样demo头文件和环境之类可以保持正确

自己的main代码

int main()
{
	
		/* The so-called POSIX-compliant MacOS X reportedly processes SIGPIPE even
		 * if it is blocked in all thread.
		 * Note: this is NOT an excuse for not protecting against SIGPIPE. If
		 * LibVLC runs outside of VLC, we cannot rely on this code snippet. */
		signal (SIGPIPE, SIG_IGN);
		/* Restore SIGCHLD in case our parent process ignores it. */
		signal (SIGCHLD, SIG_DFL);
	
#ifndef NDEBUG
		/* Activate malloc checking routines to detect heap corruptions. */
		setenv ("MALLOC_CHECK_", "2", 1);
	
		/* Disable the ugly Gnome crash dialog so that we properly segfault */
		setenv ("GNOME_DISABLE_CRASH_DIALOG", "1", 1);
#endif
	
#ifdef TOP_BUILDDIR
		setenv ("VLC_PLUGIN_PATH", TOP_BUILDDIR"/modules", 1);
		setenv ("VLC_DATA_PATH", TOP_SRCDIR"/share", 1);
#endif
	
	/* Clear the X.Org startup notification ID. Otherwise the UI might try to
	 * change the environment while the process is multi-threaded. That could
	 * crash. Screw you X.Org. Next time write a thread-safe specification. */
	unsetenv ("DESKTOP_STARTUP_ID");



	 libvlc_instance_t *vlc; 
	 libvlc_media_player_t *media_player;
	 libvlc_media_t *media;
	
	 vlc = libvlc_new(0, NULL);	
	 if(vlc == NULL)
	 {
	 	printf("wang erro libvlc_new \n");
		return -1;
	 }
	 media_player = libvlc_media_player_new(vlc);
	
	#if 1
	media =  libvlc_media_new_location(vlc,"rtsp://192.168.43.233:8989/stream");
	#else
	media =  libvlc_media_new_path(vlc,"bydtest.mp4");
	libvlc_media_add_option(media, ":sout=#duplicate{dst=rtp{sdp=rtsp://:10086/stream},dst=display}");
	#endif
	
	 if(media_player == NULL || media == NULL)
	 {
	 	printf("wang erro new_media_player \n");
		return -1;
	 }

	 libvlc_media_player_set_media(media_player,media);
	 
	 libvlc_media_player_play(media_player);

	 
	//注意release , 测试代码,没处理
      
	//play 30s	
	//usleep(10000*100*30);  
	while(1); //主线程不能退出,不然子线程也挂掉,播放不了了
	libvlc_vlm_release(vlc);	
	return 0;

}
#endif

主要步骤 

 vlc = libvlc_new(0, NULL);    

media_player = libvlc_media_player_new(vlc); //创建 media_player

media =  libvlc_media_new_location(vlc,"rtsp://192.168.43.233:8989/stream"); //创建media

libvlc_media_player_set_media(media_player,media);//设置media到mediaplayer
libvlc_media_player_play(media_player);//mediaplayer 播放

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

libvlc 使用mediaplayer 播放rtsp 的相关文章

  • C++(4) 运算符重载

    C 43 43 学习心得 xff08 1 xff09 运算符重载 from 谭浩强 C 43 43 面向对象程序设计 第一版 2014 10 6 4 1什么是运算符重载 用户根据C 43 43 提供的运算符进行重载 xff0c 赋予它们新的

随机推荐

  • C++学习心得(3)多态性与虚函数

    C 43 43 学习心得 xff08 3 xff09 多态性与虚函数 from 谭浩强 C 43 43 面向对象程序设计 第一版 2014 10 13 6 1 多态性的概念 在C 43 43 中 xff0c 多态性是指具有不同功能的函数可以
  • C发送http请求

    C语言发送http请求和普通的socket通讯 原理是一样的 无非就三步connect 连上服务器 send 发送数据 recv 接收数据 只不过发送的数据有特定的格式 下面的是简单发送一个http请求的例子 span class hljs
  • tensorflow(四十七):tensorflow模型持久化

    模型保存 span class token keyword from span tensorflow span class token keyword import span graph util graph def span class
  • git subtree使用

    在一个git项目下引用另一个项目的时 xff0c 我们可以使用 git subtree 使用 git subtree 时 xff0c 主项目下包含子项目的所有代码 使用 git subtree 主要关注以下几个功能 一个项目下如何引入另一个
  • tensorflow(四十八): 使用tensorboard可视化训练出的文本embedding

    对应 tensorflow 1 15版本 log dir span class token operator 61 span span class token string 34 logdir 34 span metadata path s
  • java中数组之间的相互赋值

    前言 本文考虑的研究对象是数组 xff0c 需要明确的是在java中 xff0c 数组是一种对象 xff0c java的所有对象的定义都是放在堆当中的 xff0c 对象变量之间的直接赋值会导致引用地址的一致 在java中声明一个数组 spa
  • tensorflow学习笔记(十):sess.run()

    session run fetch1 fetch2 关于 session run fetch1 fetch2 xff0c 请看http stackoverflow com questions 42407611 how tensorflow
  • tensorflow学习笔记(二十三):variable与get_variable

    Variable tensorflow中有两个关于variable的op xff0c tf Variable 与tf get variable 下面介绍这两个的区别 tf Variable与tf get variable tf Variab
  • pytorch 学习笔记(一)

    pytorch是一个动态的建图的工具 不像Tensorflow那样 xff0c 先建图 xff0c 然后通过feed和run重复执行建好的图 相对来说 xff0c pytorch具有更好的灵活性 编写一个深度网络需要关注的地方是 xff1a
  • pytorch学习笔记(五):保存和加载模型

    span class hljs comment 保存和加载整个模型 span torch save model object span class hljs string 39 model pkl 39 span model 61 torc
  • tensorflow:自定义op简单介绍

    本文只是简单的翻译了 https www tensorflow org extend adding an op 的简单部分 xff0c 高级部分请移步官网 可能需要新定义 c 43 43 operation 的几种情况 xff1a 现有的
  • pytorch学习笔记(十二):详解 Module 类

    Module 是 pytorch 提供的一个基类 xff0c 每次我们要 搭建 自己的神经网络的时候都要继承这个类 xff0c 继承这个类会使得我们 搭建网络的过程变得异常简单 本文主要关注 Module 类的内部是怎么样的 初始化方法中做
  • tensorflow学习笔记(四十五):sess.run(tf.global_variables_initializer()) 做了什么?

    当我们训练自己的神经网络的时候 xff0c 无一例外的就是都会加上一句 sess run tf global variables initializer xff0c 这行代码的官方解释是 初始化模型的参数 那么 xff0c 它到底做了些什么
  • 使用 spacy 进行自然语言处理(一)

    介绍 自然语言处理 NLP 是人工智能方向一个非常重要的研究领域 自然语言处理在很多智能应用中扮演着非常重要的角色 xff0c 例如 xff1a automated chat bots article summarizers multi l
  • 威联通ContainerStation部署Oracle11g

    文章目录 前言部署过程详解使用docker compose文件创建容器临时开启NAS的SSH远程访问通过SSH客户端远程连接NAS进入容器创建用户拷贝容器中的数据库相关文件至宿主机在ContainerStation中修改docker com
  • 十六进制数据与字符串的相互转换

    span class hljs keyword public span span class hljs keyword static span String span class hljs title bytesToHexString sp
  • 贪心算法详解

    前言 贪心算法是动态规划的一种特殊情况 xff0c 需要满足更为苛刻的条件 xff1a 贪心选择 算法种类时间复杂度暴力算法指数级别动态规划多项式级别贪心算法线性级别 什么是贪心选择性质呢 xff0c 简单说就是 xff1a 每一步都做出一
  • Android驱动程序开发实例精讲-0_Android系统HAL驱动开发经典案例详解(基于Android4.0)

    Android系统HAL驱动开发经典案例详解 xff08 基于Android4 0 xff09 目的 xff1a 通过学习一个LED点灯的简单功能 xff0c 掌握Linux驱动程序与HAL硬件抽象层之间的调用方法 xff0c 同时掌握JN
  • 使用putty连接到虚拟机centos被拒绝解决方法

    今天用putty去ssh本地的虚拟机中的centos系统 xff0c 发现连接被拒 xff0c 跳出了这个错误 因为是第一次用putty连接到自己电脑上的虚拟机 xff0c 碰到这个错误 xff0c 我首先想到是不是centos中的防火墙没
  • libvlc 使用mediaplayer 播放rtsp

    环境 ubuntu18 04 vlc3 0 6源码 从 github上下载的vlc 源码 xff0c 默认配置 xff0c 默认编译 xff0c 用命令 vlc rtsp 192 168 43 129 10086 stream 竟然无法播放