如何解码播放内存Buffer中的视频数据

calltaotao 2012-08-19 10:08:07
情况是这样的:
设备端采用Udp组播方式发送视频数据(只有视频数据,没有音频数据,不需要demux);
数据组包格式是自定义的,有在数据前添加自定义的包头(不是标准RTSP、RTP),编码方式是Xvid Mpeg-4;
服务端在收到数据后解包获得视频数据,目前将获得数据存储为硬盘中的文件,使用vlc是可以播放的。

需求:
需要实时播放接收到的数据。

方案1:接收后立即写入文件,不停地接收不停地写入,延时500ms调用vlc进行播放。
问题:vlc播放1-2秒后卡住,之后就不再播放。文件大小继续增长,手动使用vlc打开该文件则可继续播放。
猜测:vlc的access层应该一次会读取一定大小的文件到buffer中,然后demux和decode层解析,access层同时继续读取指定大小的文件,而文件的写入速度小于vlc的读取速度,导致vlc的access层判定已经将文件全部读取完了,于是不再读取。
请教:是否可以更改vlc每次读取的大小或者读取的速度?

方案2:将接收到的数据每帧每帧地传给解码器,解码器返回解码结果,再将解码结果显示出来。
问题: 因为使用Windows平台开发,目前似乎ffmpeg和direcctshow这两种技术都可以用,但是ffmpeg和directshow都将文件访问层封装了,解码传参都是传string(文件名或者url)。
请教:如何传入每帧的byte数组(不是结构体,是byte数组)给解码器?解码器解码后的结果如何进行播放?Windows平台使用MediaPlayer作为播放器时,传入参数也是string。

小弟初学视频解码,望各位大大不吝赐教!目前习惯使用的是C#,C++代码也看得懂,谢谢!
...全文
499 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
freelancer_ex 2012-08-28
  • 打赏
  • 举报
回复
我也经常遇见ffdhow连接不上的情况。
自己写个decoder filter。
ffmpeg/xvid都是可以的,
calltaotao 2012-08-27
  • 打赏
  • 举报
回复
XDIV MPEG-4裸数据无法调用ffdshow进行解码。

在GraphEditor中将视频文件输入,使用ffdshow进行解码,file filter的output无法连到ffdshow decoder filter的input。

该视频文件可以使用vlc进行播放,是只有视频没有音频的裸数据,I帧开头。

请教大大这是什么情况?
freelancer_ex 2012-08-21
  • 打赏
  • 举报
回复
你要做两件事情,解码和播放。
解码用ffmpeg或者xvid,两者都提供了解码数据的方法,并不是你说的只提供了文件的方式。
directshow是filter连接的方式去播放的,所谓提供文件名的方式只是你调用了它file filter的方法而已,它的解码filter已经在系统中注册,系统会自己去找,所以只需提供个文件名,它就能自己播放。现在你要播放实时流,需要自己重新写个filter filter,一般是推模式的。同时可以使用ffmpeg/xvid做个decoder filter,将这2个filter连接起来,再连接系统自带的播放filter就能完成播放了
calltaotao 2012-08-21
  • 打赏
  • 举报
回复
感谢dajjnan的解答,看了不少资料后比之前通透了。

解码:
方案1:使用ffmpeg 跳过av_open_input_file、avcodec_find_decoder,直接avcodec_open,av_read_frame,avcodec_decode_video,因为我已经知道需要使用xvid进行解码,这些步骤结束后将得到YUV或者RGB的颜色空间。
方案2:安装xvid解码器(xvid.org官方提供的,或者ffdshow都可以),使用directshow找到对应decoder filter,按要求传入PIN,得到的输出是PIN。
方案3:使用directshow,自己写decoder filter,使用ffmpeg解码,再将解码结果转化为PIN输出,得到的输出也是PIN。

播放:
方案1:如果采用解码方案1因为得到的是颜色空间,因此要么自己用GDI+画出来,要么找用于处理颜色空间的库,Linux下ffmpeg常跟SDL搭配,win下需要做SDL的移植。

方案2:如果采用解码方案2或3,则只需要调用directshow中现成的renderer filter,微软会自己调用显卡驱动将decoder filter输出PIN进行显示播发。

dajjnan 的方案是(解码方案2 or 3)+(播发方案2),显然这是最高效的方案。

目前尚未进行编码...
calltaotao 2012-08-19
  • 打赏
  • 举报
回复
小弟我有用DirectSound做过音频的播放,PCM编码,视频是否也有能够采用像音频处理那样的方式?获得数据后放入循环缓存,调用Play方法传入窗口句柄就可以?

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧