经过重重难关终于把dm365 dvsdk demos中 encode和 jrtplib结合起来发送视频给PC 用VLC接收,成功实现,延时还是有的,能感觉的出来,但是很小很小,已经很不容易了,这么长时间的努力没有白费,纪念一下!
总结一下为此做过的实验
1. DM365采集视频,264编码,tcp/udp方式传送给6410/pc继续保存为文件
2. 音频,g711编码
3. 同时采集音视频,编码,同时发送,保存为两个文件,经测试接收到的文件可以正常播放。
这三步用来学习linux网络传输
4. 采集视频,264编码,udp发送给pc,vlc实时播放已实现(但是延时1-2s)
Ps:这是测试vlc直播功能的,因为g711格式的音频vlc没法播放,只有低版本的vlc才支持直接播放264源码流,况且也不好实现音视频同步
所以必须要做成rtp流媒体
1. DM365中,264源码文件,程序找到NALU头,RTP打包,发送给VLC,边发送边播放已实现(自己用程序添加的rtp头)
2. 365中,g711文件,rtp直接打包,发送给PC vlc播放已实现,断断续续现象也解决
3. 学习VLC中sdp文件的编写
这两步是用来学习RTP协议
由于1、2两步都是在程序中直接添加RTP头的方式对数据进行打包,并非真正意义的流媒体传输,没有用到RTCP控制协议,只依靠RTP可以做到单个会话流畅但是是无法做 到音视频(两个会话间的)同步的
所以接下来需要学习jrtplib库
5. jrtplib在虚拟机中编译通过,弄明白了里面的几个C++ example程序
6. 在虚拟机中通过jrtplib将264文件发送给PC VLC接收播放,视频流畅
7. 在虚拟机中通过jrtplib发送g711音频给VLC音频播放流畅
8. 在虚拟机中通过jrtplib发送音视频文件VLC播放,音视频数据都能收到,但是不能同步,
Ps:(在这地方卡了一段时间,查看了很多的论文,发现他们在论文中提到音视频播放时候接受端要经过一个音视频同步算法,但是由于精力有限一直在做发送端,接受端一直没腾出时间来做,想如果借用VLC播放器能实现音视频同步就会省掉一大部分的时间,如果以后需要只要把VLC播放器嵌入到软件中就好)
Q:不知道VLC是否可以实现音视频同步的问题,内部是否有音视频同步的处理(应该是有的,因为VLC其实嵌入的是live555实现的RTSP),关键问题是VLC播放器在有两个媒体级绘画的时候SDP文件该如何编写?问题一直未解决
生活还得继续,果断PASS掉这部分,做不到音视频同步可以做视频监控,继续往下搞
9. jrtplib在DM365中交叉编译通过
10. 试着将jrtplib C++代码与DVSDK C代码结合,修改了DVSDK中Makefile文件和几个G++不兼容的文件后成功结合成功
11. 想要网络发送264流媒体必须要寻找到每个264 NALU但是不知道video线程中每个缓冲区存放的数据形式是什么
12. 解析DVSDK video线程中存放到内存缓冲区中的264数据,发现每次存放到缓冲区中的数据前四个字节是NALU startcode 后一个字节是NALU header 接下来肯定就是NALU payload了,既然这样就可以事半功倍了
13. 将缓冲区中的264数据通过jrtplib发送给VLC播放,实现边采集边播放,发送端没有问题,VLC播放可以通过时间戳做到实时画面,但是VLC时而解码时而不解码,导致画面不流畅,有的时候就卡住很长时间,通过网络wireshark抓包发现数据发送良好,应该是时间戳的问题,待调试
14.修改了6,8,13中的bug,分片封装时视频的时间戳没法送一包就增加,应该是发送一个NALU单元时间戳增加一次,这样8中的问题解决了
15.修改了8中的bug,ptime太小导致声音一会就没了,改打ptime值,消除了VLC是否可以做到同步的疑虑,可以做到的
16.修改了12中的bug,并不是所有的缓冲区中都是一个nalu单元的,有的缓冲区存放的是几个nalu单元,添加了在缓冲区寻找nalu单元的代码
17.修改了13中bug,f值设置为26时视频流畅延时小
18在speech线程中添加了jrtplib打包发送音频数据,音频部分相对容易很多,直接对数据发送就好,并且音频部分的buf为固定大小160字节,注意一点的是添加上音频发送后相当于是两个会话,这两个会话的本地端口不能一样,不然报错 2014.07.06
总结:中间还有很多细节的问题,这样也可以交差了,下一步实现live555的视频服务器