请问,能否不通过JAVA层,直接将C/C++层解析出来的视频流buffer 填充到PacketQueue? 看了下 video_thread 解码线程,没看明白该如何填充buffer或通过哪个接口填充buffer。。
[bilibili/ijkplayer]https://github.com/bilibili/ijkplayer/issues/3558 (使用私有协议的第三模块接收到的视频buffer流 如何使用ijkplayer进行解码播放?)关于这个已关闭问题的新疑问
回答
你这buffer是未解封装的数据还是已经解封装的?
PacketQueue中放入的是解封装后的数据,可以修改read_thread来喂数据;
如果是未解封装的,你可以实现一个ffmpeg的protocol来对接数据源;
我们尝试过解封装的方案和未解封装的方案。 解封装的方案,我们对接的是第三方提供的播放器接口,他们的接口接收的是ES流,即解封装需要我们自己处理,这个方案虽然播放效果不错,但第三方的东西我们看不到,我们想对播放拥有更多的控制,所以就有了别的方案。 未解封装的方案,我们对接的是NuPlayer,直接传的TS流buffer,但这种方案,播放效果不是很好,需要修改NuPlayer,而且也不好改,并且芯片厂也会修改到这部分代码,后续可能不好维护。
所以,就有了现在的ijkplayer方案的尝试,由于后续可能会有不同的数据源,如果每种数据源都自己处理解封装,,,也是挺麻烦的。。。所以,个人对第二个方法——“实现一个ffmpeg的protocol来对接数据源”比较感兴趣,由于对FFmpeg并不熟悉,请问,你说的这个方法,网上或者书籍有参考吗?或者能否说详细点,多谢!
比如添加方法可以参考这篇:https://www.jianshu.com/p/8e971df30b5b
protocol的实现就要看你对接的第三方的接口了。
我做过的案例的有用ijkplayer播放蓝光影片,和播放公司定制的rtsp流。你可以从模仿ffmpeg libavformat目录下的protocol开始,比如模仿file.c.
还有一种方案,你可以起一个本地的视频服务,比如http服务,把第三方的视频数据转换为标准的http视频流,然后就可以用任意的播放器来播放了。
好的,多谢!
@compilelife 尝试了下 “protocol” 方案,感觉不好弄啊。。“本地视频服务”的方案有什么参考吗?多谢!
@BruceLing “本地视频服务”的方案就是起一个http服务,然后把你的视频文件通过该http服务提供为一个点播流。如果需要支持seek会稍微复杂点。 如果要在Java上做,可以用Nanohttpd做http服务。
我近期在写一个轻量的http推流项目,可以满足类似“把第三方模块的视频数据提供给任意播放器播放”的需求,会尽快开源。
如果您有项目进度考虑,也可以找我定制开发 :)
如果不是 视频文件 ,而是我的数据源就是 Ts流buffer 呢?能比较好的搞成本地服务吗?
@BruceLing 抱歉,github不及时看。可以私我(QQ 505610414)
应该没问题,如果是ts流,基本与视频文件等效,不难;如果是es流,也可以通过ffmpeg封装为ts推流。
@BruceLing https://github.com/compilelife/xport
@compilelife 做一个http server确实是好办法。P2P,私有协议,都可以通过这个代理实现对接。这样对播放器的侵入最少。
楼主,我遇到了和你一样的问题,我现在是直接把收到的TS流转储成TS文件,然后ijkplayer就直接播放了,异步的,一个线程一直写,然后播放器一遍播,播完就删文件,假装是在直播