前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >码流管理机制

码流管理机制

作者头像
lcyw
发布2022-06-10 19:22:25
2490
发布2022-06-10 19:22:25
举报
文章被收录于专栏:machh的专栏machh的专栏

码流管理机制

(1) 码流的接收

在发送端码流发送很快的情况下,由于接收端不仅要接收码流,还要进行分析,解码,这个处理需要一个较长的过程,如果接收端顺序执行这个过程的话,会导致无法完整接收发送端的包、出现丢包,由此而带来的是解码错误、无法正常播放视频、甚至程序奔溃等严重错误。针对这个问题我们采取并发的处理机制予以解决。线程并发存在的一个意义就是为了提高运行在单处理器上的速度。

在java中我们采用java.util.concurrent包中的执行器(Executor)来管理线程Thread对象。我们创建20个线程, 也就是向SingleThreadExecutor提交了20个任务,这些任务将排好队,每个任务会在下一个任务开始之前运行结束,每个任务都是按照他们被提交的顺序,在下一个任务开始之前完成。这样不仅实现了快速的接收而且还保证了接收到的包顺序是正确的。通过这样的处理后,接收和分析解码可以被分成两个部分,我们可以把接收到的数据暂时存放在缓冲区,然后就可以接着去接收下一包数据,不用等着分析、解码完成后才去接收下一包数据。这样做大大提高了接收效率,同时避免了丢包问题。

(2) 视频数据解析和解码

由于采用了并发的机制,接收到的数据不止一包,所以对接收到的数据应该做怎样合理的处理,成为我们接下来的难点。

我们需要保证的仍然是数据包的顺序,还且每次只能处理一包,这里涉及到一个线程之间的协作问题。我们采用消费者生产者这种线程协作模式来做处理。我们将从存放数据的缓冲区中按顺序取到的包经过分析后放入另外一个缓冲区,通知解码程序可以进行从此缓冲区中获得数据解码,然后分析视频数据的程序进入等待。解码完成后,通知分析视频数据的程序继续进行视频数据分析,同时解码程序又进入等待。两个程序在执行和等待中交替进行。

(3) 多级缓冲机制。上面我们也提到了几个缓冲,总结如下。

①接收后存放数据的缓冲,

由于服务器端源源不断的实时码流,和采用了并发机制后带来更大量的数据,我们不可能马上处理完,所以必须设置一个缓冲区。

②接收端和处理端之间的缓冲,

由于网络不稳定,接收到的数据可能会有时快有时慢,这直接会造成解码的不稳定和视频播放的不连续,所以在此设置一个缓冲,起到一个平滑,过渡的作用,这个缓冲区既要存放接收到大量的码流还要为视频数据分析提供数据,有个写读入和读出的过程,所以我们使用先入先出的队列Queue容器来做缓冲区。

③解析和解码过程之间的缓冲,

由于在此过程中的数据量相较而言不是很大,而这个获取数据的速度直接影响了解码的速度,所以我们要用一个高效的缓冲区来担当此时的缓冲作用,由于stack是由系统自动分配,所以速度比较快,所以我们就在栈上分配一个数组用于存储即可。

④解码后到播放之间的缓冲,

这个缓冲区同样除了起到使播放视频连续稳定的作用外,主要就是用来显示图像,还可以对视频图像进行一些处理工作,平滑,滤波等。

(3).解码和播放的实现

H.264解码是移植了ffmpeg 中的H.264解码部分到Android,并且了深度删减优化。界面部分,文件接收处理以及视频显示都是用java做的,底层的视频解码部分则使用C来做从而满足速度的要求。H.264码流分割NAl(接受到视频数据的复原工作)是在java层做而没有分装到c中,是因为每次送的数据会受到限制,如果送的数据量大,底层可能会一次解码好几帧视频,但是到界面层只能显示一帧,造成丢帧。如果每次送的数据量较少,就会使得多次底层调用但并没有进行实质解码的现象发生,所以尽管这样做耦合度差些,速度慢些,但是综合考虑还是将数据分析工作放在java层完成。

我们将解码后的视频数据用bitmap显示,draw到surfaceView的方法显示到手机屏上,由于有些手机不支持rgb24但几乎所有手机都支持rgb565,所以解码后返回的是rgb565数据。

4.程序流程功能架构

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-08-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 音视频开发训练营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档