|
|
@ -62,25 +62,23 @@ void Cffmpeg_decode::setPushStream(bool bPushStream) {
|
|
|
|
bool Cffmpeg_decode::open_input_file() {
|
|
|
|
bool Cffmpeg_decode::open_input_file() {
|
|
|
|
if (_url.isEmpty())
|
|
|
|
if (_url.isEmpty())
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
m_rtsp_transport = _url.left(4) == "rtmp" ? "tcp" : "udp";
|
|
|
|
if (!m_bSetRtspTransport) {
|
|
|
|
|
|
|
|
m_rtsp_transport = _url.left(4) == "rtmp" ? "tcp" : "udp";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//========================解码============================
|
|
|
|
//========================解码============================
|
|
|
|
AVDictionary *avdic = NULL;
|
|
|
|
AVDictionary *avdic = NULL;
|
|
|
|
// 以udp方式打开,如果以tcp方式打开将udp替换为tcp
|
|
|
|
|
|
|
|
int ret = av_dict_set(&avdic, "rtsp_transport",
|
|
|
|
|
|
|
|
m_rtsp_transport.toUtf8().data(), 0);
|
|
|
|
|
|
|
|
// 如果设置失败,则设置UDP传输
|
|
|
|
// 如果设置失败,则设置UDP传输
|
|
|
|
if (avdic == NULL || ret < 0) {
|
|
|
|
if (m_rtsp_transport == "udp")
|
|
|
|
if (m_rtsp_transport == "tcp")
|
|
|
|
av_dict_set(&avdic, "rtsp_transport", "udp", 0);
|
|
|
|
av_dict_set(&avdic, "rtsp_transport", "udp", 0);
|
|
|
|
else
|
|
|
|
else
|
|
|
|
av_dict_set(&avdic, "rtsp_transport", "tcp", 0);
|
|
|
|
av_dict_set(&avdic, "rtsp_transport", "tcp", 0);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 设置缓存大小,1080p可将值调大
|
|
|
|
// 设置缓存大小,1080p可将值调大
|
|
|
|
av_dict_set(&avdic, "buffer_size", "4096000", 0);
|
|
|
|
av_dict_set(&avdic, "buffer_size", "4096000", 0);
|
|
|
|
// 设置超时断开连接时间,单位微秒//listen_timeout
|
|
|
|
// 设置超时断开连接时间,单位微秒//listen_timeout
|
|
|
|
// av_dict_set(&avdic, "listen_timeout", "200000", 0);
|
|
|
|
// av_dict_set(&avdic, "listen_timeout", "200000", 0);
|
|
|
|
av_dict_set(&avdic, "stimeout", "2000000", 0); // 设置超时2秒
|
|
|
|
av_dict_set(&avdic, "stimeout", "3000000", 0); // 设置超时3秒
|
|
|
|
av_dict_set(&avdic, "max_delay", "3", 0); // 设置最大时延
|
|
|
|
av_dict_set(&avdic, "max_delay", "300000", 0); // 设置最大时延300ms
|
|
|
|
av_dict_set(&avdic, "tune", "zerolatency", 0); // 实时编码
|
|
|
|
av_dict_set(&avdic, "tune", "zerolatency", 0); // 实时编码
|
|
|
|
av_dict_set(&avdic, "preset", "ultrafast", 0);
|
|
|
|
av_dict_set(&avdic, "preset", "ultrafast", 0);
|
|
|
|
av_dict_set(&avdic, "threads", "auto", 0); // 自动开启线程数
|
|
|
|
av_dict_set(&avdic, "threads", "auto", 0); // 自动开启线程数
|
|
|
@ -99,7 +97,7 @@ bool Cffmpeg_decode::open_input_file() {
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 从输入流中找到第一个视频流
|
|
|
|
// 从输入流中找到第一个视频流
|
|
|
|
for (int i = 0; i < inputFormatCtx->nb_streams; i++) {
|
|
|
|
for (uint i = 0; i < inputFormatCtx->nb_streams; i++) {
|
|
|
|
if (inputFormatCtx->streams[i]->codecpar->codec_type ==
|
|
|
|
if (inputFormatCtx->streams[i]->codecpar->codec_type ==
|
|
|
|
AVMEDIA_TYPE_VIDEO) {
|
|
|
|
AVMEDIA_TYPE_VIDEO) {
|
|
|
|
videoStreamIndex = i;
|
|
|
|
videoStreamIndex = i;
|
|
|
@ -166,7 +164,7 @@ bool Cffmpeg_decode::open_input_file() {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 裸流保存初始化
|
|
|
|
// 裸流保存初始化
|
|
|
|
// m_saveVideoFlag = openSave();
|
|
|
|
m_saveVideoFlag = openSave();
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -247,7 +245,6 @@ void Cffmpeg_decode::run() {
|
|
|
|
first_frame_system_time = av_gettime(); // 系统时间(秒)
|
|
|
|
first_frame_system_time = av_gettime(); // 系统时间(秒)
|
|
|
|
previous_pts_time = pts_time;
|
|
|
|
previous_pts_time = pts_time;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 转化为RGB图像并显示
|
|
|
|
// 转化为RGB图像并显示
|
|
|
|
sws_scale(swsCtx, //
|
|
|
|
sws_scale(swsCtx, //
|
|
|
|
yuvFrame->data, //
|
|
|
|
yuvFrame->data, //
|
|
|
@ -413,4 +410,7 @@ void Cffmpeg_decode::saveDone() {
|
|
|
|
m_saveVideoFlag = false;
|
|
|
|
m_saveVideoFlag = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Cffmpeg_decode::setFlowType(QString param) { m_rtsp_transport = param; }
|
|
|
|
void Cffmpeg_decode::setFlowType(QString param) {
|
|
|
|
|
|
|
|
m_rtsp_transport = param;
|
|
|
|
|
|
|
|
m_bSetRtspTransport = true;
|
|
|
|
|
|
|
|
}
|
|
|
|