WriteN, RTMP send error 32 (133 bytes)
WriteN, RTMP send error 32 (49 bytes)
WriteN, RTMP send error 9 (42 bytes)
现象:
推流失败,srs服务出错。
原因
视频流较慢,音频流较快。
复现
视频解码得到帧数据,用异步接口处理帧数据,在回调函数中取回处理完的帧数据再编码推流,此时因为处理帧数据有一定的延时,10ms左右,所以在 write_frame 时,写入了较多的音频数据和少量的视频数据,推流时报错。
处理
将音频帧数据存到一个队列中,每一次异步接口返回时,从队列中弹出适当的音频帧数据。
ret = av_interleaved_write_frame(fmt_rtmp_ctx_, pkt);
AVPacket* audio_packet = NULL;
if (!audio_packets_queue_.empty()) {
audio_packet = audio_packets_queue_.front();
} else {
return ret;
}
while(audio_packet->pts < video_pts_ + 200) {
printf("audio pts: %ld dts: %ld duration: %ld\n", audio_packet->pts, audio_packet->dts, audio_packet->duration);
av_interleaved_write_frame(fmt_rtmp_ctx_, audio_packet);
mutex_.lock();
audio_packets_queue_.pop();
av_packet_free(&audio_packet);
if (audio_packets_queue_.empty()) {
mutex_.unlock();
break;
}
audio_packet = audio_packets_queue_.front();
mutex_.unlock();
}
av_packet_unref(pkt);