linphone录像问题

        linphone 的媒体流是以插件的方式运转的,在视频通话的时候,同时运转音频发送、音频接收、视频发送和视频接收这四个插件链。

也即是说在四个线程里处理音频发送接收和视频发送接收。现在我需要实现录像功能,录制自己和对方的声音加上对方的影像,而这些

数据在三个线程里面流通,那如何实现录制功能,实现双方音频的同步以及音视频同步呢?希望广大网友也给出自己的设计。我先写出

我目前的实现方式,也算是抛砖引玉。

       linphone里面filter之间的数据交换都是打包在结构mblk_t里面,这个结构里面也可以同时存放时间戳,录像功能里的数据同样使用

这个结构。

方式一、录制nalu

1.在录像初始化的时候初始化三个queue,用来存放两路音频的数据和一路视频的数据;同时初始化ffmeg,音频AAC,视频H264,

文件格式mp4;初始化之后创建一个线程来处理编码和写文件的工作。

2.在linphone MSAndSoundWrite插件和MSAndSoundRead插件里把音频pcm数据打上时间戳并入队列,在视频解码插件里,把视频

H264帧打时间戳并入队列。

3.在录像线程里读取三个队列的数据,对音频pcm数据做AAC编码,然后以双声道方式写入文件;对视频H264数据直接写文件。

4.音视频同步,两路音频的同步和音频与视频的同步是关键,根据时间戳也不能完全同步,期待哪位高手给出好的建议。

方式二、录制yuv

这个是特殊场景的实现方式,比如可以切换本地和远程的图像,选择屏幕上显示本地的图像还是远程的图像,那这时候需要录制显示的图像,所以有可能录制本地的,也可能录制远程的,如果交替写入本地和远程的nalu码流,是无法解码的。所以这种情况下只有拿到本地和远程的yuv数据,然后自己编码写文件。

 

实现音视频同步的关键在序列化音频数据流和保证写文件时处理音频和视频流的时序。

你可能感兴趣的:(linphone录像问题)