欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

libvlc 使用mediaplayer 播放rtsp

程序员文章站 2022-07-07 11:10:34
...

环境  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抓包分析

libvlc 使用mediaplayer 播放rtsp

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

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

libvlc 使用mediaplayer 播放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

//查找一下 

libvlc 使用mediaplayer 播放rtsp

}

所有 描述为 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 播放