我不知道用于av_dict_set设置超时的时间单位

问题描述 投票:8回答:1

我很困惑。我正在使用av_dict_set函数设置超时,但是当我搜索有关av_dict_set的信息时,时间单位似乎有所不同。我现在不知道该如何设置。谁能帮忙?

我发现了一些类似以下的代码:

pFormatCtx = avformat_alloc_context();

av_dict_set(&opts, "rtsp_transport", "tcp", 0);
//av_dict_set(&opts, "timeout", "5000000", 0);
if(strncmp(stream_url, "rtmp:", sizeof("rtmp:")) == 0){
    av_dict_set(&opts, "timeout", "6", 0); // in secs
}
else if(strncmp(stream_url, "http:", sizeof("http:")) == 0){
    av_dict_set(&opts, "timeout", "6000", 0); // in ms
}

if(avformat_open_input(&pFormatCtx, stream_url, NULL, &opts)!=0)
{
  return 1;
}

也许应该根据不同的协议(http或rtsp)设置时间单位。

代码在右上方吗?

http ffmpeg timeout rtsp
1个回答
0
投票

TL; DR

  • RTMP和RTSP协议,时基:;
  • HTTP协议,时基:微秒(不是毫秒)。

因此只需通过乘以当前值* 1000来相应地修复HTTP部分。


FULL

我有一个C ++应用程序,该应用程序使用libav编码 H.264 / AAC RTSP流并将其推送到本地RTSP服务器,然后再为其提供服务。另外,我还有另一个C ++应用程序,该应用程序使用libav对RTSP流进行[[decode,从数据包中提取视频/音频数据,对其进行重新缩放并使用SFML显示来自缓冲区的像素数据。

decoding

应用程序中,我使用timeout选项来确定RTSP流是否可用。这是一个可选参数,但是如果解码过程早于可用的RTSP流开始,则如果未设置timeout,则解码过程会挂起。发生这种情况是因为RTSP和HTTP协议的默认值为-1,这意味着“无限等待”。如果您改为将其设置为其他值,并且发生这种情况,则avformat_open_input将返回AVERROR代码,您可以对其进行进一步分析,例如,您可以通过重新开始重新尝试重新连接到RTSP流,从而得到您可以更好地控制执行流程。所以问题是:“

此值的正确时基是什么,所以我可以相应地使用它?

here所述,对于[[RTSP协议,您可以设置timeout选项以建立等待打开流所需的最长时间。在

RTSP部分中,指南明确指出此值以seconds

估算。 超时
设置等待进入连接的最大超时(以秒为单位)。>

值-1表示无穷大(默认)。此选项意味着rtsp_flags设置为“监听”。

尽管它没有为

RTMP协议]指定它,但我已经通过将我的

RTSP URL

更改为RTMP URL而没有改变时基并且已经按预期工作了,所以我对其进行了测试。推论是两个协议共享相同的时基。
此外,对于HTTP协议,在同一页面的here中,可以出于相同目的设置timeout值,但时基必须在

微秒

中。
超时
设置底层底层操作使用的套接字I / O操作的超时(以微秒为单位)。默认情况下,它设置为-1,这表示未指定超时。

因此,在您的情况下,您需要替换,因为您期望的时基不正确

(我假设您是指

毫秒

,正确的时间是微秒
,以便具有6s超时而不是0.006s超时:else if(strncmp(stream_url, "http:", sizeof("http:")) == 0){ av_dict_set(&opts, "timeout", "6000", 0); // in ms } 带有此:
else if(strncmp(stream_url, "http:", sizeof("http:")) == 0){
    av_dict_set(&opts, "timeout", "6000000", 0); // In microseconds
}

正如您的示例显示了如何执行此操作,您分配了格式上下文;然后,在打开流之前,创建一个AVDictionary并将timeout值设置为av_dict_set。您还可以设置其他选项。通过将此字典传递给avformat_open_input,将所有这些信息传递给。

in line 405 in libavformat\utils.c所述,字典信息将被复制到解码器格式上下文priv_data,并将用于打开流。

如果触发超时,则该函数将返回AVERROR代码。

avformat_network_init(); AVFormatContext* muxer_receiver = avformat_alloc_context(); AVDictionary* options = NULL; av_dict_set(&options, "timeout", "3", 0); if(avformat_open_input(&muxer_receiver, "rtsp://:32400/live/1", NULL, &options)!=0){ return EXIT_FAILURE; } if(avformat_find_stream_info(muxer_receiver, NULL)<0){ return EXIT_FAILURE; } // Do stuff like retrieving video and audio streams index av_read_play(muxer_receiver);

© www.soinside.com 2019 - 2024. All rights reserved.