vc中ffmpeg+sdl如何实现多路网络视频流播放?

时间:2022-07-21 12:04:08
参照ffmplay实现一路的网络视频流播放,但是多路的时候有好多问题,一路的时候调用avformat_open_input_file(),avformat_find_stream_info()打开接收网络流是没有问题的,但是多线程二次调用该函数的时候就出现错误,想问下各位大神该怎么处理,是否多路网络流接收不能简单调用ffmpeg库函数avformat_open_input_file(),avformat_find_stream_info()?

26 个解决方案

#1


vc中ffmpeg+sdl如何实现多路网络视频流播放?

#2


该问题已经解决,probe_size设置太小,单路的时候avformat_find_stream_info()还行,多路不行的,不过有新的问题,原来用的SDL1.25不能开多通道,需要升级sdl2版本

#3


引用 2 楼 lostcumt 的回复:
该问题已经解决,probe_size设置太小,单路的时候avformat_find_stream_info()还行,多路不行的,不过有新的问题,原来用的SDL1.25不能开多通道,需要升级sdl2版本
怎么升级sdl版本?

#4


升级后 ffplay.c还需要改什么?

#5


大神帮帮忙呗?qq:976205168

#6


引用 5 楼 wangzongze1015 的回复:
大神帮帮忙呗?qq:976205168

我也还在进行中...SDL2出来晚,教程不多,希望这个能帮到你http://airmanisvip.blog.163.com/blog/static/18058158201261015741216/
http://download.csdn.net/detail/chlfamily/6758015

#7


谢咯,相互交流。我前几天看到一篇文章不错 你看看http://blog.csdn.net/ashqal/article/details/17722935

#8


我的一播第二路视频 刚开始几秒还可以,再过几秒两路都中断了。这是为啥?

#9


你有没有加入断点调试具体是什么时候exit的?
有可能是你的变量没有处理好,ffplay用太多的全局变量,容易多线程冲突
你看看是不是下面文章中提到的内存冲突问题
http://www.chinavideo.org/archiver/?tid-17184.html

#10


我的打开两路有时候是没有问题的,不过有时候会出现内存冲突,不知道具体你的什么情况

#11


引用 8 楼 wangzongze1015 的回复:
我的一播第二路视频 刚开始几秒还可以,再过几秒两路都中断了。这是为啥?

我的多路问题不大了,你自己好好看看,很可能是有些公用的变量被多个线程同时调用了,加油啊,我做了一个学期的解码

#12


嗯 谢谢咯。你还在上学?以为你都上班了呢?大几?

#13


引用 9 楼 lostcumt 的回复:
你有没有加入断点调试具体是什么时候exit的?
有可能是你的变量没有处理好,ffplay用太多的全局变量,容易多线程冲突
你看看是不是下面文章中提到的内存冲突问题
http://www.chinavideo.org/archiver/?tid-17184.html
万分感谢呀 你也用的sdl2.0?播视频的时候在哪里设置视频显示的大小,为啥我的只显示一部分?

#14


引用 11 楼 lostcumt 的回复:
Quote: 引用 8 楼 wangzongze1015 的回复:

我的一播第二路视频 刚开始几秒还可以,再过几秒两路都中断了。这是为啥?

我的多路问题不大了,你自己好好看看,很可能是有些公用的变量被多个线程同时调用了,加油啊,我做了一个学期的解码
还有呀,我现在只是显示视频 没有添加音频部分多路是好着的,就是显示的时候随着窗口越来越小 每个窗口所显示的内容只是一部分,这怎么解决?我用的是   
screen = SDL_CreateWindowFrom(pparam->hWnd);
SDL_SetWindowFullscreen(screen,SDL_WINDOW_FULLSCREEN_DESKTOP);
传句柄显示的,加上第二句的话每个窗口都能显示全部信息,可是每次只能显示一路。不加的话只显示一部分。。。

#15


引用 14 楼 wangzongze1015 的回复:
Quote: 引用 11 楼 lostcumt 的回复:

Quote: 引用 8 楼 wangzongze1015 的回复:

我的一播第二路视频 刚开始几秒还可以,再过几秒两路都中断了。这是为啥?

我的多路问题不大了,你自己好好看看,很可能是有些公用的变量被多个线程同时调用了,加油啊,我做了一个学期的解码
还有呀,我现在只是显示视频 没有添加音频部分多路是好着的,就是显示的时候随着窗口越来越小 每个窗口所显示的内容只是一部分,这怎么解决?我用的是   
screen = SDL_CreateWindowFrom(pparam->hWnd);
SDL_SetWindowFullscreen(screen,SDL_WINDOW_FULLSCREEN_DESKTOP);
传句柄显示的,加上第二句的话每个窗口都能显示全部信息,可是每次只能显示一路。不加的话只显示一部分。。。

试试用这个函数设置显示窗口大小SDL_SetWindowSize(SDL_Window* window,int w,int h)
显示从你定义的控件左上位置开始,如果显示图片过大,超出对话框部分是不会显示的

#16


引用 13 楼 wangzongze1015 的回复:
Quote: 引用 9 楼 lostcumt 的回复:

你有没有加入断点调试具体是什么时候exit的?
有可能是你的变量没有处理好,ffplay用太多的全局变量,容易多线程冲突
你看看是不是下面文章中提到的内存冲突问题
http://www.chinavideo.org/archiver/?tid-17184.html
万分感谢呀 你也用的sdl2.0?播视频的时候在哪里设置视频显示的大小,为啥我的只显示一部分?

我不懂你说的一部分是什么情况,是显示图像一部分吗?SDL2渲染纹理时,SDL_UpdateTexture第二个参数用NULL好了,选择全部的区域

#17


引用 16 楼 lostcumt 的回复:
Quote: 引用 13 楼 wangzongze1015 的回复:

Quote: 引用 9 楼 lostcumt 的回复:

你有没有加入断点调试具体是什么时候exit的?
有可能是你的变量没有处理好,ffplay用太多的全局变量,容易多线程冲突
你看看是不是下面文章中提到的内存冲突问题
http://www.chinavideo.org/archiver/?tid-17184.html
万分感谢呀 你也用的sdl2.0?播视频的时候在哪里设置视频显示的大小,为啥我的只显示一部分?

我不懂你说的一部分是什么情况,是显示图像一部分吗?SDL2渲染纹理时,SDL_UpdateTexture第二个参数用NULL好了,选择全部的区域
就是图像只显示了左上角的一部分,举个例子,原本图像1080*720的 我传的显示句柄的大小只有600*460的他就从原来图像的左上角只给显示600*460这么大的。多路的话更糟,将600*460等分4 16 等相应的也就只显示那么大而已

#18


引用 15 楼 lostcumt 的回复:
Quote: 引用 14 楼 wangzongze1015 的回复:

Quote: 引用 11 楼 lostcumt 的回复:

Quote: 引用 8 楼 wangzongze1015 的回复:

我的一播第二路视频 刚开始几秒还可以,再过几秒两路都中断了。这是为啥?

我的多路问题不大了,你自己好好看看,很可能是有些公用的变量被多个线程同时调用了,加油啊,我做了一个学期的解码
还有呀,我现在只是显示视频 没有添加音频部分多路是好着的,就是显示的时候随着窗口越来越小 每个窗口所显示的内容只是一部分,这怎么解决?我用的是   
screen = SDL_CreateWindowFrom(pparam->hWnd);
SDL_SetWindowFullscreen(screen,SDL_WINDOW_FULLSCREEN_DESKTOP);
传句柄显示的,加上第二句的话每个窗口都能显示全部信息,可是每次只能显示一路。不加的话只显示一部分。。。

试试用这个函数设置显示窗口大小SDL_SetWindowSize(SDL_Window* window,int w,int h)
显示从你定义的控件左上位置开始,如果显示图片过大,超出对话框部分是不会显示的
不显示怎么办?我等让其全部显示呀

#19


引用 18 楼 wangzongze1015 的回复:
显示从你定义的控件左上位置开始,如果显示图片过大,超出对话框部分是不会显示的
不显示怎么办?我等让其全部显示呀
你可以用sws_scale将你要显示的视频图片设置到你需要的大小,也可以在SDL_SetWindowSize的时候设置窗口等比例的缩小些,不要让窗口超过对话框边界,你好好去看看现在版本的ffplay.c,ffplay 默认的是sws_scale只转换格式不缩放大小,默认设置显示窗口大小为解码的帧图片大小,这些都需要自己去修改的
留个邮箱:lostcumt@163.com,有问题大家相互交流下,相互学习

#20


引用 19 楼 lostcumt 的回复:
Quote: 引用 18 楼 wangzongze1015 的回复:

显示从你定义的控件左上位置开始,如果显示图片过大,超出对话框部分是不会显示的
不显示怎么办?我等让其全部显示呀

你可以用sws_scale将你要显示的视频图片设置到你需要的大小,也可以在SDL_SetWindowSize的时候设置窗口等比例的缩小些,不要让窗口超过对话框边界,你好好去看看现在版本的ffplay.c,ffplay 默认的是sws_scale只转换格式不缩放大小,默认设置显示窗口大小为解码的帧图片大小,这些都需要自己去修改的
留个邮箱:lostcumt@163.com,有问题大家相互交流下,相互学习谢了 。

#21


引用 10 楼 lostcumt 的回复:
我的打开两路有时候是没有问题的,不过有时候会出现内存冲突,不知道具体你的什么情况
内存冲突你怎么解决的?  我试了SDL_SetWindowSize的是可以等比例缩小,问题是我不想让他缩小图像的大小,我想让4窗口 16窗口窗口缩小图像缩小后,要图像全部显示呀?

#22


引用 2 楼 lostcumt 的回复:
该问题已经解决,probe_size设置太小,单路的时候avformat_find_stream_info()还行,多路不行的,不过有新的问题,原来用的SDL1.25不能开多通道,需要升级sdl2版本
可以了  再问您个问题,你做多路视频播的同时切换窗口模式没?

#23


博主你好,我想为一下,多路视频的解码模式,你是开得多线程,一个线程解一路吗?
如果说这样,我想要对两路视频进行对比分析,一路是本地视频,另一路是本地视频经过网络传输之后接收,开双线程肯定很麻烦,我现在是用的MFC定时器解码的,在定时器里先将A路的帧解出,再解B路,依次循环。
对于这样的设计,博主有什么好的建议吗

#24


我用ffmpeg+ddraw 实现多路解码显示,可以看我的博客

#25


http://blog.csdn.net/zhuweigangzwg/article/details/17223841 这个把文件换成url剩下都是一样的。可以参考下。

#26


probesize设置大的话播放前延时很大,小的话有时候取不到流信息播放不了,楼主有没有出现过这个问题?

#1


vc中ffmpeg+sdl如何实现多路网络视频流播放?

#2


该问题已经解决,probe_size设置太小,单路的时候avformat_find_stream_info()还行,多路不行的,不过有新的问题,原来用的SDL1.25不能开多通道,需要升级sdl2版本

#3


引用 2 楼 lostcumt 的回复:
该问题已经解决,probe_size设置太小,单路的时候avformat_find_stream_info()还行,多路不行的,不过有新的问题,原来用的SDL1.25不能开多通道,需要升级sdl2版本
怎么升级sdl版本?

#4


升级后 ffplay.c还需要改什么?

#5


大神帮帮忙呗?qq:976205168

#6


引用 5 楼 wangzongze1015 的回复:
大神帮帮忙呗?qq:976205168

我也还在进行中...SDL2出来晚,教程不多,希望这个能帮到你http://airmanisvip.blog.163.com/blog/static/18058158201261015741216/
http://download.csdn.net/detail/chlfamily/6758015

#7


谢咯,相互交流。我前几天看到一篇文章不错 你看看http://blog.csdn.net/ashqal/article/details/17722935

#8


我的一播第二路视频 刚开始几秒还可以,再过几秒两路都中断了。这是为啥?

#9


你有没有加入断点调试具体是什么时候exit的?
有可能是你的变量没有处理好,ffplay用太多的全局变量,容易多线程冲突
你看看是不是下面文章中提到的内存冲突问题
http://www.chinavideo.org/archiver/?tid-17184.html

#10


我的打开两路有时候是没有问题的,不过有时候会出现内存冲突,不知道具体你的什么情况

#11


引用 8 楼 wangzongze1015 的回复:
我的一播第二路视频 刚开始几秒还可以,再过几秒两路都中断了。这是为啥?

我的多路问题不大了,你自己好好看看,很可能是有些公用的变量被多个线程同时调用了,加油啊,我做了一个学期的解码

#12


嗯 谢谢咯。你还在上学?以为你都上班了呢?大几?

#13


引用 9 楼 lostcumt 的回复:
你有没有加入断点调试具体是什么时候exit的?
有可能是你的变量没有处理好,ffplay用太多的全局变量,容易多线程冲突
你看看是不是下面文章中提到的内存冲突问题
http://www.chinavideo.org/archiver/?tid-17184.html
万分感谢呀 你也用的sdl2.0?播视频的时候在哪里设置视频显示的大小,为啥我的只显示一部分?

#14


引用 11 楼 lostcumt 的回复:
Quote: 引用 8 楼 wangzongze1015 的回复:

我的一播第二路视频 刚开始几秒还可以,再过几秒两路都中断了。这是为啥?

我的多路问题不大了,你自己好好看看,很可能是有些公用的变量被多个线程同时调用了,加油啊,我做了一个学期的解码
还有呀,我现在只是显示视频 没有添加音频部分多路是好着的,就是显示的时候随着窗口越来越小 每个窗口所显示的内容只是一部分,这怎么解决?我用的是   
screen = SDL_CreateWindowFrom(pparam->hWnd);
SDL_SetWindowFullscreen(screen,SDL_WINDOW_FULLSCREEN_DESKTOP);
传句柄显示的,加上第二句的话每个窗口都能显示全部信息,可是每次只能显示一路。不加的话只显示一部分。。。

#15


引用 14 楼 wangzongze1015 的回复:
Quote: 引用 11 楼 lostcumt 的回复:

Quote: 引用 8 楼 wangzongze1015 的回复:

我的一播第二路视频 刚开始几秒还可以,再过几秒两路都中断了。这是为啥?

我的多路问题不大了,你自己好好看看,很可能是有些公用的变量被多个线程同时调用了,加油啊,我做了一个学期的解码
还有呀,我现在只是显示视频 没有添加音频部分多路是好着的,就是显示的时候随着窗口越来越小 每个窗口所显示的内容只是一部分,这怎么解决?我用的是   
screen = SDL_CreateWindowFrom(pparam->hWnd);
SDL_SetWindowFullscreen(screen,SDL_WINDOW_FULLSCREEN_DESKTOP);
传句柄显示的,加上第二句的话每个窗口都能显示全部信息,可是每次只能显示一路。不加的话只显示一部分。。。

试试用这个函数设置显示窗口大小SDL_SetWindowSize(SDL_Window* window,int w,int h)
显示从你定义的控件左上位置开始,如果显示图片过大,超出对话框部分是不会显示的

#16


引用 13 楼 wangzongze1015 的回复:
Quote: 引用 9 楼 lostcumt 的回复:

你有没有加入断点调试具体是什么时候exit的?
有可能是你的变量没有处理好,ffplay用太多的全局变量,容易多线程冲突
你看看是不是下面文章中提到的内存冲突问题
http://www.chinavideo.org/archiver/?tid-17184.html
万分感谢呀 你也用的sdl2.0?播视频的时候在哪里设置视频显示的大小,为啥我的只显示一部分?

我不懂你说的一部分是什么情况,是显示图像一部分吗?SDL2渲染纹理时,SDL_UpdateTexture第二个参数用NULL好了,选择全部的区域

#17


引用 16 楼 lostcumt 的回复:
Quote: 引用 13 楼 wangzongze1015 的回复:

Quote: 引用 9 楼 lostcumt 的回复:

你有没有加入断点调试具体是什么时候exit的?
有可能是你的变量没有处理好,ffplay用太多的全局变量,容易多线程冲突
你看看是不是下面文章中提到的内存冲突问题
http://www.chinavideo.org/archiver/?tid-17184.html
万分感谢呀 你也用的sdl2.0?播视频的时候在哪里设置视频显示的大小,为啥我的只显示一部分?

我不懂你说的一部分是什么情况,是显示图像一部分吗?SDL2渲染纹理时,SDL_UpdateTexture第二个参数用NULL好了,选择全部的区域
就是图像只显示了左上角的一部分,举个例子,原本图像1080*720的 我传的显示句柄的大小只有600*460的他就从原来图像的左上角只给显示600*460这么大的。多路的话更糟,将600*460等分4 16 等相应的也就只显示那么大而已

#18


引用 15 楼 lostcumt 的回复:
Quote: 引用 14 楼 wangzongze1015 的回复:

Quote: 引用 11 楼 lostcumt 的回复:

Quote: 引用 8 楼 wangzongze1015 的回复:

我的一播第二路视频 刚开始几秒还可以,再过几秒两路都中断了。这是为啥?

我的多路问题不大了,你自己好好看看,很可能是有些公用的变量被多个线程同时调用了,加油啊,我做了一个学期的解码
还有呀,我现在只是显示视频 没有添加音频部分多路是好着的,就是显示的时候随着窗口越来越小 每个窗口所显示的内容只是一部分,这怎么解决?我用的是   
screen = SDL_CreateWindowFrom(pparam->hWnd);
SDL_SetWindowFullscreen(screen,SDL_WINDOW_FULLSCREEN_DESKTOP);
传句柄显示的,加上第二句的话每个窗口都能显示全部信息,可是每次只能显示一路。不加的话只显示一部分。。。

试试用这个函数设置显示窗口大小SDL_SetWindowSize(SDL_Window* window,int w,int h)
显示从你定义的控件左上位置开始,如果显示图片过大,超出对话框部分是不会显示的
不显示怎么办?我等让其全部显示呀

#19


引用 18 楼 wangzongze1015 的回复:
显示从你定义的控件左上位置开始,如果显示图片过大,超出对话框部分是不会显示的
不显示怎么办?我等让其全部显示呀
你可以用sws_scale将你要显示的视频图片设置到你需要的大小,也可以在SDL_SetWindowSize的时候设置窗口等比例的缩小些,不要让窗口超过对话框边界,你好好去看看现在版本的ffplay.c,ffplay 默认的是sws_scale只转换格式不缩放大小,默认设置显示窗口大小为解码的帧图片大小,这些都需要自己去修改的
留个邮箱:lostcumt@163.com,有问题大家相互交流下,相互学习

#20


引用 19 楼 lostcumt 的回复:
Quote: 引用 18 楼 wangzongze1015 的回复:

显示从你定义的控件左上位置开始,如果显示图片过大,超出对话框部分是不会显示的
不显示怎么办?我等让其全部显示呀

你可以用sws_scale将你要显示的视频图片设置到你需要的大小,也可以在SDL_SetWindowSize的时候设置窗口等比例的缩小些,不要让窗口超过对话框边界,你好好去看看现在版本的ffplay.c,ffplay 默认的是sws_scale只转换格式不缩放大小,默认设置显示窗口大小为解码的帧图片大小,这些都需要自己去修改的
留个邮箱:lostcumt@163.com,有问题大家相互交流下,相互学习谢了 。

#21


引用 10 楼 lostcumt 的回复:
我的打开两路有时候是没有问题的,不过有时候会出现内存冲突,不知道具体你的什么情况
内存冲突你怎么解决的?  我试了SDL_SetWindowSize的是可以等比例缩小,问题是我不想让他缩小图像的大小,我想让4窗口 16窗口窗口缩小图像缩小后,要图像全部显示呀?

#22


引用 2 楼 lostcumt 的回复:
该问题已经解决,probe_size设置太小,单路的时候avformat_find_stream_info()还行,多路不行的,不过有新的问题,原来用的SDL1.25不能开多通道,需要升级sdl2版本
可以了  再问您个问题,你做多路视频播的同时切换窗口模式没?

#23


博主你好,我想为一下,多路视频的解码模式,你是开得多线程,一个线程解一路吗?
如果说这样,我想要对两路视频进行对比分析,一路是本地视频,另一路是本地视频经过网络传输之后接收,开双线程肯定很麻烦,我现在是用的MFC定时器解码的,在定时器里先将A路的帧解出,再解B路,依次循环。
对于这样的设计,博主有什么好的建议吗

#24


我用ffmpeg+ddraw 实现多路解码显示,可以看我的博客

#25


http://blog.csdn.net/zhuweigangzwg/article/details/17223841 这个把文件换成url剩下都是一样的。可以参考下。

#26


probesize设置大的话播放前延时很大,小的话有时候取不到流信息播放不了,楼主有没有出现过这个问题?