FFmpeg接收UDP码流

这篇具有很好参考价值的文章主要介绍了FFmpeg接收UDP码流。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、FFmpeg参数初始化:

    //在打开码流前指定各种参数比如:探测时间/超时时间/最大延时等

    //设置缓存大小,1080p可将值调大
    av_dict_set(&options, "buffer_size", "8192000", 0);

    //以tcp方式打开,如果以udp方式打开将tcp替换为udp
    av_dict_set(&options, "rtsp_transport", transport.toUtf8().constData(), 0);

    //设置超时断开连接时间,单位微秒,3000000表示3秒
    av_dict_set(&options, "stimeout", "3000000", 0);

    //设置最大时延,单位微秒,1000000表示1秒
    av_dict_set(&options, "max_delay", "1000000", 0);

    //自动开启线程数
    av_dict_set(&options, "threads", "auto", 0);

    //等待3秒超时
    av_dict_set(&options, "listen_timeout", "3", 0);

二、初始化输入

AVFormatContext* formatCtx = avformat_alloc_context();

//关键函数,提供从udp进行码流读取
//read_udp_packet函数中将opaque转换为UdpReceiver指针(receiver_udp即该指针),从而获得socket信息
//通过调用recvfrom进行udp码流读取
formatCtx->pb = avio_alloc_context(buffer, bufsize,0,receiver_udp, read_udp_packet, NULL, NULL);

int result = avformat_open_input(&formatCtx, 0, ifmt, &options);

三、后续的一系列操作就按照普通解码顺序进行即可。


用UDP读取码流的相关代码:文章来源地址https://www.toymoban.com/news/detail-646138.html

    //windows平台下初始化套接字
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        return;
    }

    SOCKET sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if ( sockfd == -1) {
        printf("socket error!!!\n");
        return ;
    }

    int reuse = 1;
    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char *)&reuse, sizeof(reuse)) < 0) {
        printf("Setting SO_REUSEADDR error");
        closesocket(sockfd);
        return ;
    }

    unsigned int recvBuf = 50*1024*1024;
    int recvBufLen = sizeof(recvBuf);
    auto nErrCode = setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF,(char*)&recvBuf, recvBufLen);

    sockaddr_in* localaddr = new struct sockaddr_in;
    localaddr->sin_family = AF_INET;
    localaddr->sin_port = htons(MULTICAST_GROUP_PORT);
    localaddr->sin_addr.s_addr = inet_addr(LOCAL_IP.toStdString().c_str())/* htonl(INADDR_ANY)*/;


    struct timeval tv_out;
    tv_out.tv_sec=3000;
    tv_out.tv_usec=0;
    int ret =setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv_out, sizeof(tv_out));
    if ( ret == -1 ) {
        printf("setsockopt timeout error!!!\n");
        closesocket(sockfd);
        return ;
    }

    ret = bind(sockfd, (struct sockaddr*)localaddr, sizeof(struct sockaddr));
    if ( ret == -1) {
        printf("bind localaddr error!!!\n");
        auto id = WSAGetLastError();
        closesocket(sockfd);
        return ;
    }

   //是否支持本地回环接收
   int loopBack = 1;
   ret = setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_LOOP, (const char *)&loopBack, sizeof(loopBack));
   if ( ret == -1) {
       printf("setsockopt broadcaset error!!!\n");
       closesocket(sockfd);
       return ;
   }

    //是否接收广播消息
    struct ip_mreq ipmr = { 0 };
    ipmr.imr_interface.s_addr = inet_addr(LOCAL_IP.toStdString().c_str()) /*(INADDR_ANY)*/;
    ipmr.imr_multiaddr.s_addr = inet_addr(MULTICAST_GROUP_ADDRESS.toStdString().c_str());
    int len = sizeof(ipmr);
    ret = setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&ipmr, len);
    if ( ret == -1) {
        printf("set error IP_ADD_MEMBERSHIP %d\n", WSAGetLastError());
        closesocket(sockfd);
        return ;
    }


    //关闭套接字,释放资源
    closesocket(sockfd);
    WSACleanup();

到了这里,关于FFmpeg接收UDP码流的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#开发FFMPEG例子(API方式) FFmpeg推送udp组播流

    代码及工程见https://download.csdn.net/download/daqinzl/88156926 开发工具:visual studio 2019 播放,可采用ffmpeg工具集里的ffplay.exe, 执行命令 ffplay udp://238.1.1.10:6016 也可以参考(C#开发FFMPEG例子(API方式) FFmpeg拉取udp组播流并播放) https://blog.csdn.net/daqinzl/article/details/132112075 网上用C/C++调用FFmp

    2024年02月14日
    浏览(41)
  • ffmpeg推流rtmp指定udp传输

    RTMP (Real-Time Messaging Protocol) 是一个用于音频、视频和数据的传输协议。RTMP 协议本身可以支持 TCP 或 UDP 作为其底层传输协议。 在 RTMP 中,TCP 是默认的传输协议,它的稳定性和可靠性比 UDP 更好。但是,TCP 的延迟较高,对于实时性要求较高的音视频应用来说可能不太适合。 相

    2024年02月15日
    浏览(40)
  • ffmpeg SDL播放器--播放udp组播流

    c++调用ffmpeg api及SDL库播放播放udp组播流。 代码及工程见https://download.csdn.net/download/daqinzl/88168574 参考文档:https://blog.csdn.net/a53818742/article/details/109312740 开发工具:visual studio 2019 记得推送udp流,可采用ffmpeg工具集里的ffmpeg.exe推送, 执行命令 ffmpeg -f gdigrab -r 23 -i desktop -pkt_size

    2024年02月14日
    浏览(41)
  • c++调用ffmpeg api将视频文件内容进行udp推流

    代码及工程见https://download.csdn.net/download/daqinzl/88156926 开发工具:visual studio 2019 播放,采用ffmpeg工具集里的ffplay.exe, 执行命令 ffplay udp://238.1.1.10:6016 主要代码如下: #include \\\"pch.h\\\" #include iostream using namespace std; #include stdio.h #define __STDC_CONSTANT_MACROS extern \\\"C\\\" { #include \\\"include/libavcodec/

    2024年02月14日
    浏览(42)
  • 使用FFmpeg将本地文件通过UDP推流的音视频

    推流是指将音视频数据通过网络传输到指定的目标端,而FFmpeg是一个功能强大的跨平台多媒体处理工具,可以用于音视频编解码、转码、处理等操作。本文将介绍如何使用FFmpeg将本地文件通过UDP协议进行推流,实现音视频数据的传输。 首先,需要确保已经安装了FFmpeg工具。如

    2024年03月19日
    浏览(69)
  • c++调用ffmpeg api录屏 并进行udp组播推流

    代码及工程见https://download.csdn.net/download/daqinzl/88155241 开发工具:visual studio 2019 播放,采用ffmpeg工具集里的ffplay.exe, 执行命令 ffplay udp://224.1.1.1:5001 主要代码如下: #include \\\"pch.h\\\" #include iostream using namespace std; #include stdio.h #define __STDC_CONSTANT_MACROS extern \\\"C\\\" { #include \\\"include/libavcodec/

    2024年02月14日
    浏览(44)
  • 千兆以太网传输层 UDP 协议原理与 FPGA 实现(UDP接收)

    相关文章: (1)千兆以太网网络层 ARP 协议的原理与 FPGA 实现 (2)千兆以太网硬件设计及链路层 MAC 协议格式 (3)CRC校验原理及实现 (4)RGMII 与 GMII 转换电路设计 (5)千兆以太网网络层 IP 协议介绍与 IP 校 验和算法实现 (6)千兆以太网传输层 UDP 协议原理与 FPGA 实现(

    2024年02月04日
    浏览(128)
  • ffmpeg 从avio_write 到 udp_write

    ffmpeg 从avio_write 到 udp_write --------------------------------------------- author: hjjdebug date: 2024年 03月 11日 星期一 14:16:44 CST description: ffmpeg 从avio_write 到 udp_write --------------------------------------------- 文章目录: 1. main 调用avio_write 2. avio_write 调用flush_buffer 3. flush_buffer 调用的writeout函数 3.1, 挖掘

    2024年03月26日
    浏览(41)
  • python ffmpeg将mp4文件实时转码为ts,并指定pid等信息,输出到udp

    要将MP4文件实时转码为TS格式,并将PID等信息指定为UDP输出,可以使用 subprocess 模块和ffmpeg命令行工具来实现。以下是一个示例代码,用于实时转码并将输出发送到UDP服务器: 在上述代码中,我们首先定义了输入文件、UDP服务器地址和PID等信息。然后,我们使用 subprocess.Pop

    2024年01月22日
    浏览(62)
  • Qt网络编程 (udp广播和接收例)

    使用两个项目 1 sender 用来广播\\\"hello world\\\"; 2 receiver 用来接收广播信息 1 创建Qdialog类 2 在sender.pro 中添加 QT +=network 一行代码 3 在sender.h 中声明类 class QUdpSocket; 在声明一个私有对象 QUdpSocket *sender; 4 在ui界面拖入一个按钮 用来触发广播信息 其槽函数如下 在sender.cpp 构造函数中添

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包