前言:
最近在进行一个PC对PC端的直播功能的研发,主要需要实现从PC端捕获桌面处理成H264视频流,以及采集PC端的扬声器的声音处理成AAC音频流,通过RTMP推流到服务器端中,然后客户端可以从服务器中拉流并播放视频,最终实现直播的功能。该项目主要运用到FFMPEG实现音视频的编解码和拉流,使用SDL进行对音视频的播放。
在实现该功能的过程中,总共可以分为如下几个模块:
1、音频的采集、编码;
2、桌面捕获和图像编码;
3、音视频的同步及推流(核心);
4、音视频的拉流及解码;
5、音视频同步播放(核心);
其中音视频编解码是项目的基础,音视频的同步是项目的核心,在后续的文章中将分章节讲述该项目实现的过程。
下面的代码就是用来设置在拉流rtmp时ffmpeg是否有缓存,我们这里为了降低延时,就将缓存不要了,直接去掉,在我的项目中得到了比较大效果,由原来的延时3秒降低到延时1秒。
AVDictionary *options = NULL;
av_dict_set(&options, "fflags", "nobuffer", 0); //无缓存,解码时有效
if (avformat_open_input(&m_pFormatContext, filename, NULL, &options) != 0)
{
log_print(LOG_ERR, "avformat_open_input failed, %s\r\n", filename);
return FALSE;
}
//减低延迟操作:减少探测的时间
m_pFormatContext->probesize = 100 * 1024;
m_pFormatContext->max_analyze_duration = 5*AV_TIME_BASE;
avformat_find_stream_info(m_pFormatContext, NULL);