gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:20:27 61 4
gpt4 key购买 nike

我很困惑。我正在使用 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;
}

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

上面的代码对吗?

最佳答案

TL;博士

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

  • 因此,只需将当前值乘以 *1000 即可相应地修复 HTTP 部分。

    满的
    我有一个使用 的 C++ 应用程序libav 编码 一个 H.264/AAC RTSP 流并将其推送到本地 RTSP 服务器,然后为其提供服务。此外,我还有另一个使用 libav 的 C++ 应用程序 解码 此 RTSP 流,从数据包中提取视频/音频数据,重新缩放它们并使用 SFML 从缓冲区显示像素数据。
    解码 我使用的应用程序 timeout用于确定 RTSP 流是否可用的选项。这是一个可选参数,但如果解码过程在 RTSP 流可用之前开始,则解码过程会在 timeout 时挂起。未设置。这是因为 RTSP 和 HTTP 协议(protocol)的默认值为 -1 ,这意味着“无限等待”。如果您将其设置为不同的值并发生这种情况, avformat_open_input将返回 AVERROR您可以进一步分析的代码,例如,您可以通过简单地重新开始尝试重新连接到 RTSP 流,从而让您更好地控制执行流程。
    所以问题是:“ 这个值的正确时基是什么,所以我可以相应地使用它?
    如记录 here , 对于 RTSP协议(protocol) ,可以设置 timeout选项来确定等待打开流所需的最长时间。在 RTSP 部分,该指南明确指出该值估计为 :

    timeout

    Set maximum timeout (in seconds) to wait for incoming connections.

    A value of -1 means infinite (default). This option implies the rtsp_flags set to ‘listen’.


    虽然它没有为 指定它RTMP协议(protocol) ,我已经通过更改我的 对其进行了测试RTSP 网址 RTMP 网址 在不改变时基的情况下,它按预期工作,所以我的推论是两个协议(protocol)共享相同的时基。
    此外,在同一页面中, here , 对于 HTTP协议(protocol) ,可以设置 timeout用于相同目的的值,但时基必须为 微秒 .

    timeout

    Set timeout in microseconds of socket I/O operations used by the underlying low level operation. By default it is set to -1, which means that the timeout is not specified.


    因此,在您的情况下,您需要更换,因为您期望的时基不正确(我假设您的意思是 毫秒 ),正确的是 微秒 ,为了有 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);

    关于http - 我不知道用于 av_dict_set 设置超时的时间单位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34034125/

    61 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com