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);