wirshark发包工具源码

2023-11-01

需要下载https://link.csdn.net/?target=https%3A%2F%2Fwww.winpcap.org%2Finstall%2Fbin%2FWpdPack_4_1_2.zip开源库并且使用。
目前只能发送udp的码流

#define HAVE_REMOTE
#define WPCAP
#pragma comment(lib,“wpcap.lib”)
#include <pcap.h>
#include <stdlib.h>
#include <stdio.h>
#include<Winsock2.h>
#include
#include<windows.h>
#include “kdvtype.h”
#include<string.h>
#include <iphlpapi.h>

#pragma comment(lib,“ws2_32.lib”)
#pragma comment(lib,“iphlpapi.lib”)

using namespace std;

#define ETHER_ADDR_LEN 6
#define ETHERTYPE_PUP 0x0200 /* Xerox PUP /
#define ETHERTYPE_SPRITE 0x0500 /
Sprite /
#define ETHERTYPE_IP 0x0800 /
IP /
#define ETHERTYPE_ARP 0x0806 /
Address resolution /
#define ETHERTYPE_REVARP 0x8035 /
Reverse ARP /
#define ETHERTYPE_AT 0x809B /
AppleTalk protocol /
#define ETHERTYPE_AARP 0x80F3 /
AppleTalk ARP /
#define ETHERTYPE_VLAN 0x8100 /
IEEE 802.1Q VLAN tagging /
#define ETHERTYPE_IPX 0x8137 /
IPX /
#define ETHERTYPE_IPV6 0x86dd /
IP protocol version 6 /
#define ETHERTYPE_LOOPBACK 0x9000 /
used to test interfaces /
#define MaxQueueLength 2500000 /
max length of queue */
#define DATA_NO_ERROR 0
#define IP_HEADER_ERROR -1

s32 data_handle(pcap_pkthdr * &pktheader,const u8 * &pchBuffer,s32 nInDlt);
u16 CalcChecksum(u16 *pwBuffer, s32 nSize);

s8 *g_pachSrcIP = new char[20];//存储源IP地址
s8 *g_pachDstIP = new char[20];//存储目的IP地址
u16 g_wSport = 0;//发送端口
u16 g_wDport = 0;//接收端口
s8 errbuf[PCAP_ERRBUF_SIZE] = { 0 };//用于保存错误信息
s32 g_nRtpLen = 0;
u16 g_nOldPT = 0;
u16 g_nNewPT = 0;

//保存以太网首部
struct TEther_header
{
u8 ether_dhost[ETHER_ADDR_LEN]; //目的MAC地址
u8 ether_shost[ETHER_ADDR_LEN]; //源MAC地址
u16 ether_type; //帧类型
};

//保存IPV4首部
struct TIp_header
{
u8 ihl:4; //IP header length
u8 version:4; //IP version
u8 tos; //Type of service
u16 tot_len; //Total length
u16 id; //Unique identifier
u16 frag_off; //Fragment offset field
u8 ttl; //Time to live
u8 protocol; //Protocol type
u16 check; //IP checksum
unsigned int saddr; //Source address
unsigned int daddr; //Destination address
};

//保存TCP首部
struct TTcphdr
{
u16 srcport; // 源端口
u16 dstport; // 目的端口
u32 seqnum; // 顺序号
u32 acknum; // 确认号
u8 dataoff; // TCP头长
u8 flags; // 标志(URG、ACK等)
u16 window; // 窗口大小
u16 check; // 校验和
u16 urg_ptr; // 紧急指针
};

//保存UDP首部
struct TUdphdr
{
u16 source; //source port
u16 dest; //destination port
u16 len; //udp length
u16 check; //udp checksum
};

//保存RTP首部
struct TRtphdr
{
u16 cc:4; /* CSRC count /
u16 x:1; /
header extension flag /
u16 p:1; /
padding flag /
u16 v:2; /
packet type /
u16 pt:7; /
payload type /
u16 m:1; /
marker bit /
u16 seq; /
sequence number /
u32 ts; /
timestamp /
u32 ssrc; /
synchronization source */
};

//保存UDP伪首部
struct TPsd_Header
{
u32 sourceip; //源IP地址
u32 destip; //目的IP地址
u8 mbz; //置空(0)
u8 ptcl; //协议类型
u16 plen; //UDP数据包总长度(单位:字节)
};

void main()
{
s32 nPcaplen = 0;
s32 nErr = 0;
s32 nCont = 0;
s32 nRet = 0;
s32 nInDlt = 0;
s32 nIndex = 0;
s32 nGet = 0;
s32 nLoop = 0;
s32 nSend = 0;
s32 nBind = 0;
long lCurTvUsec = 0;
long lCurTvSec = 0;
long lLastTvUsec = 0;
long lLastTvSec = 0;
long lDifTvUsec = 0;
s8 *file = new char[20];
s8 *DstIP = new char[20];
s8 *SrcIP = new char[20];
s8 packet_filter[512] = {“ip and udp and not icmp”};
u16 wDstPort = 0;
u16 wSrcPort = 0;
unsigned int res = 0;
unsigned int netmask = 0;
pcap_send_queue *ptSqueue = NULL;
struct pcap_pkthdr pktheader = NULL;
struct bpf_program fcode;
const u8 pktdata = NULL;
pcap_t
ptIndev = NULL;
pcap_t
ptOutdev = NULL;
pcap_if_t *alldevs =NULL;
pcap_if_t *d = NULL;
FILE *fp = NULL;
pcap_if_t *ptTemp = NULL;
struct sockaddr_in tDstAddr;
struct sockaddr_in tSrcAddr;

//从配置文件获取数据
LPTSTR lpPath =LPTSTR(new char[MAX_PATH]);
strcpy((char *)lpPath,"./config.ini");
GetPrivateProfileString("FILTERINFO","SRC_IP",NULL,SrcIP,20,lpPath);//获取过滤的源IP,默认返回值NULL
GetPrivateProfileString("FILTERINFO","DST_IP",NULL,DstIP,20,lpPath);//获取过滤的目的IP,默认返回值NULL
GetPrivateProfileString("SENDINFO","SRC_IP",NULL,g_pachSrcIP,20,lpPath);//获取发送的源IP,默认返回值NULL
GetPrivateProfileString("SENDINFO","DST_IP",NULL,g_pachDstIP,20,lpPath);//获取发送的目的IP,默认返回值NULL
GetPrivateProfileString("FILE","NAME",NULL,file,20,lpPath);//由NAME字段获取文件名,默认返回值NULL
wSrcPort = (u16)GetPrivateProfileInt("FILTERINFO","SRC_PORT",0,lpPath);//获取过滤的源端口,默认返回值0
wDstPort = (u16)GetPrivateProfileInt("FILTERINFO","DST_PORT",0,lpPath);//获取过滤的目的端口,默认返回值0
g_wSport = (u16)GetPrivateProfileInt("SENDINFO","SRC_PORT",0,lpPath);//由SRC_PORT字段获取源端口,默认返回值0
g_wDport = (u16)GetPrivateProfileInt("SENDINFO","DST_PORT",0,lpPath);//由DST_PORT字段获取目的端口,默认返回值0
g_nOldPT = (u16)GetPrivateProfileInt("SETPT","OLDPT",0, lpPath);
g_nNewPT = (u16)GetPrivateProfileInt("SETPT", "NEWPT", 0, lpPath);

printf("+++wSrcPort:%d\n",wSrcPort);
//添加过滤条件
if(*SrcIP != '0')
{
	sprintf(packet_filter,"%s and src host %s",packet_filter,SrcIP);
}

if(*DstIP != '0')
{
	sprintf(packet_filter,"%s and dst host %s",packet_filter,DstIP);
}

if(wSrcPort != 0)
{
	sprintf(packet_filter,"%s and src port %u",packet_filter,wSrcPort);
}

if(wDstPort != 0)
{
	sprintf(packet_filter,"%s and dst port %u",packet_filter,wDstPort);
}

WSADATA WSAData;
WORD sockVersion = MAKEWORD(2,2);//当前版本号为2.2
if(WSAStartup(sockVersion,&WSAData)!=0)
{
	printf("WSAStartup error\n");
	return;
}

SOCKET nSockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); //创建套接字
//判断创建是否成功
if(nSockfd == SOCKET_ERROR)
{
	printf("socket error:%d\n", WSAGetLastError);
	closesocket(nSockfd);
	return;
}

memset(&tSrcAddr,0,sizeof(tSrcAddr));
tSrcAddr.sin_family = AF_INET; //IP协议
tSrcAddr.sin_port = htons(g_wSport);//端口
tSrcAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//设置IP地址

nBind = bind(nSockfd,(SOCKADDR *)&tSrcAddr,sizeof(SOCKADDR));
if (nBind == SOCKET_ERROR)
{
	printf("bind error:%d\n", WSAGetLastError);
	closesocket(nSockfd);
	return;
}
memset(&tDstAddr,0,sizeof(tDstAddr));
tDstAddr.sin_family = AF_INET; //IP协议
tDstAddr.sin_port = htons(g_wDport);//端口
tDstAddr.sin_addr.S_un.S_addr = inet_addr(g_pachDstIP);//设置IP地址

/*s32 nFlag = 1;
if(setsockopt(nSockfd, IPPROTO_IP, IP_HDRINCL, (s8 *)&nFlag, sizeof(nFlag))<0)
{
    printf("setsockopt() error!/n");
	printf("错误代码是:%d\n",WSAGetLastError());
    closesocket(nSockfd);
	system("pause");
	return;   
}*/

//获取网卡接口列表
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf) == -1)
{
	printf("error in pcap_findalldevs_ex:%s",errbuf);
	system("pause");
	return ;
}

printf("网络接口设备列表如下:\n");

for(d = alldevs; d!=NULL; d = d->next)
{
	printf("%d. %s", ++nIndex, d->name);
    if(d->description)
	{
		printf(" (%s)\n", d->description);
	}
    else
	{
		printf(" (No description available)\n");
	}
}

printf("\n请选择设备:\n");
while(1)
{
	cin>>nGet;
	if(nGet <=0 || nGet >nIndex)
	{
		printf("输入错误,请重新输入\n");
	}
	else
	{
		break;
	}
}

//跳转至指定设备
for(s32 i = 1; i < nGet; i++)
{
	alldevs = alldevs->next;
}
ptTemp = alldevs;

//打开pcap文件
nErr = fopen_s(&fp,file,"r");
if(nErr != 0)
{
	 printf("open pcap file error , please check file name\n");
	 pcap_freealldevs(ptTemp);
	 system("pause");
	 return;
}

//获取pcap文件长度
if(fseek(fp,0,SEEK_END) == -1)//错误返回-1
{
	perror("get pcap file length error:");//打印错误原因
	system("pause");
	return;
}
nPcaplen = ftell(fp) - sizeof(struct pcap_file_header);//ftell用于得到文件位置指针当前位置相对于文件首的偏移字节数
fclose(fp);

printf("是否循环发送:\n1.是  2.否\n");
cin>>nLoop;

do{
	//打开数据包文件并进行读取,数据格式与tcpdump和tcpslice兼容
	if((ptIndev = pcap_open_offline(file,errbuf))==NULL)
	{
		printf("pcap_open_offline error: %s\n",errbuf);//errbuf传递错误信息
		printf("warning :Pcapng format is not supported!\n");//无法打开pcapng文件,需要转化成pcap文件 
		pcap_freealldevs(ptTemp);
		system("pause");
		return;
	}	

	//获取数据包捕获描述符,查看数据包
	if((ptOutdev = pcap_open_live(ptTemp->name,//指定打开的设备名
		65536,//捕获数据的最大字节数
		1,    //设置混杂模式
		1000, //读取超时时间 单位:毫秒
		errbuf)) == NULL)
	{
		printf("pcap_open_live error :%s\n",errbuf);
		pcap_freealldevs(ptTemp);
		system("pause");
		return;
	}

	nInDlt = pcap_datalink(ptIndev);//获取链路层类型

	//这里只考虑以太网和Linux
	if(nInDlt!=DLT_EN10MB && nInDlt!=DLT_LINUX_SLL)
	{
		printf("program works only on Ethernet networks and Linux cooked capture!\n");
		pcap_freealldevs(ptTemp);
		system("pause");
		return;
	}

	//获取netmask
	if(ptTemp->addresses != NULL)
	{
		netmask = ((struct sockaddr_in*)(ptTemp->addresses->netmask))->sin_addr.S_un.S_addr;
	}
	else
	{
		netmask = 0xffffff;/* 255.255.255.0 */
	}

	//编译过滤器
	if(pcap_compile(ptIndev,&fcode,packet_filter,1,netmask)<0)
	{
		printf("compile error\n");
		printf("Warning :incorrect ip address or port!");
		pcap_freealldevs(ptTemp);
		system("pause");
		return;
	}

	if(pcap_setfilter(ptIndev,&fcode) < 0)
	{
		printf("setfilter error\n");
		pcap_freealldevs(ptTemp);
		system("pause");
		return;
	}

	//按帧发送
	while((res = pcap_next_ex(ptIndev, &pktheader, &pktdata)) == 1)
	{
		nCont++;
		nRet = data_handle(pktheader,pktdata,nInDlt);

		lDifTvUsec = (pktheader->ts.tv_sec-lLastTvSec)*1000+(pktheader->ts.tv_usec-lLastTvUsec)/1000;
		if(nCont == 1 || lDifTvUsec < 0)
		{
			lDifTvUsec = 0;
		}
		printf("ts.tv_sec = %ld , tv_usec =%ld  ", pktheader->ts.tv_sec, pktheader->ts.tv_usec);
		printf("lDifTvUsec= %ld  ",lDifTvUsec);
		Sleep(lDifTvUsec);

		nSend = sendto(nSockfd,(s8 *)pktdata,nRet,0,(struct sockaddr *)&tDstAddr, sizeof(SOCKADDR));
		printf("nSend = %d\n",nSend);
		if(nSend < 0)
		{
			printf("sendto error:%d\n", WSAGetLastError);
			goto stop;
		}
		
		lLastTvSec = pktheader->ts.tv_sec;//获取时间戳秒位
		lLastTvUsec = pktheader->ts.tv_usec;//获取时间戳毫秒位
	}

	/*//获取最后一个数据包,将最后一帧所在队列发送
	if (res == (unsigned int)-2)
	{
		nCont++;
		nRet = data_handle(pktheader,pktdata,nInDlt);

		lDifTvUsec = (pktheader->ts.tv_sec-lLastTvSec)*1000+(pktheader->ts.tv_usec-lLastTvUsec)/1000;

		nSend = sendto(nSockfd,(s8 *)pktdata,nRet,0,(struct sockaddr *)&tDstAddr, sizeof(SOCKADDR));
		printf("nSend = %d\n",nSend);
		if(nSend < 0)
		{
			printf("sendto error:%d\n", WSAGetLastError);
			goto stop;
		}

		lLastTvSec = 0;//获取时间戳秒位
		lLastTvUsec = 0;//获取时间戳毫秒位
	}*/

	lLastTvSec = 0;
	lLastTvUsec = 0;
	nCont = 0;
}while(nLoop == 1);

stop:
pcap_freealldevs(ptTemp);
pcap_close(ptIndev);
pcap_close(ptOutdev);
closesocket(nSockfd);
WSACleanup();
return;
}

/*=============================================================================
函 数 名: CalcChecksum
功 能: 校验和计算, 在外壳调用前保证为nSize偶数
算法实现: (可选项)
全局变量: 无
参 数: u16 wBuffer
s32 nSize 偶数
返 回 值: u16
=============================================================================
/
u16 CalcChecksum(u16 *pwBuffer, s32 nSize)
{
u32 dwCkSum = 0;

//把所有16位的字相加,如果遇到进位,则将高于16字节的进位部分的值加到最低位上
while (nSize > 1)
{
    dwCkSum += *pwBuffer++;
    nSize  -= sizeof(u16);
}
if(nSize)
{
    dwCkSum += *(u8*)pwBuffer;
}

dwCkSum  = (dwCkSum >> 16) + (dwCkSum & 0xffff);
dwCkSum += (dwCkSum >> 16);

return (u16)(~dwCkSum);//取反

}

/=============================================================================
函数名 :udp data_handle
功能 :数据包处理
算法实现 :(可选项)
引用全局变量:无
输入参数说明:
&pktheader 数据包头的引用
&pchBuffer 数据包内容的引用
nDlt 数据包文件描述符
&dwTimeStamp 数据包时间戳的引用
返回值说明: 正常返回DATA_NO_ERROR
=============================================================================
/
s32 data_handle(pcap_pkthdr * &pktheader,const u8 * &pchBuffer,s32 nDlt)
{
s32 nRtpLen = 0;
//对于Linux 只需偏移2个字节即可
if(nDlt == DLT_LINUX_SLL)
{
pchBuffer += 2;
pktheader->len -= 2;
pktheader->caplen -= 2;
}

TEther_header* ptEther_header  =  (TEther_header*)pchBuffer;//以太网首部指针
TIp_header* ptIp_header	=	(TIp_header*)(pchBuffer + sizeof(TEther_header));//IP数据头指针
TUdphdr* ptUdp_header  =  (TUdphdr*)(pchBuffer + sizeof(TEther_header) + sizeof(TIp_header));//UDP数据头指针
TRtphdr* ptRtp_header =  (TRtphdr*)(pchBuffer + sizeof(TEther_header) + sizeof(TIp_header)+sizeof(TUdphdr));//RTP数据头指针

pchBuffer = (u8 *)ptRtp_header;

if (ptRtp_header->pt == g_nOldPT)
{
	ptRtp_header->pt = g_nNewPT;
}

nRtpLen = htons(ptUdp_header->len)-8;
return nRtpLen;

}

/=============================================================================
函数名 :udp data_handle
功能 :数据包处理
算法实现 :(可选项)
引用全局变量:无
输入参数说明:
&pktheader 数据包头的引用
&pchBuffer 数据包内容的引用
nDlt 数据包文件描述符
&dwTimeStamp 数据包时间戳的引用
返回值说明: 正常返回DATA_NO_ERROR
=============================================================================
/
s32 tcp_data_handle(pcap_pkthdr * &pktheader,const u8 * &pchBuffer,s32 nDlt)
{
s32 nRtpLen = 0;
//对于Linux 只需偏移2个字节即可
if(nDlt == DLT_LINUX_SLL)
{
pchBuffer += 2;
pktheader->len -= 2;
pktheader->caplen -= 2;
}

TEther_header* ptEther_header  =  (TEther_header*)pchBuffer;//以太网首部指针
TIp_header* ptIp_header	=	(TIp_header*)(pchBuffer + sizeof(TEther_header));//IP数据头指针
//TUdphdr* ptUdp_header  =  (TUdphdr*)(pchBuffer + sizeof(TEther_header) + sizeof(TIp_header));//UDP数据头指针
//TRtphdr* ptRtp_header =  (TRtphdr*)(pchBuffer + sizeof(TEther_header) + sizeof(TIp_header)+sizeof(TUdphdr));//RTP数据头指针

TTcphdr* ptTcp_header  =  (TTcphdr*)(pchBuffer + sizeof(TEther_header) + sizeof(TIp_header));//TCP数据头指针
TRtphdr* ptRtp_header =  (TRtphdr*)(pchBuffer + sizeof(TEther_header) + sizeof(TIp_header)+sizeof(TTcphdr));//RTP数据头指针

pchBuffer = (u8 *)ptRtp_header;

if (ptRtp_header->pt == g_nOldPT)
{
	ptRtp_header->pt = g_nNewPT;
}
printf("+++pt:%d\n",ptRtp_header->pt);
nRtpLen = htons(ptTcp_header->window)-20;
return nRtpLen;

}

/*#define _CRT_SECURE_NO_WARNINGS // 消除fopen告警
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include
#include <winsock2.h>

#pragma comment(lib, “ws2_32.lib”)

int main(int argn, char*agrv[])
{
if(argn < 2)
{
printf(“请把要解析的文件作为第一个参数.\n”);
getchar();
return 0;
}

FILE *fp = fopen(agrv[1], "rb");
if (!fp) 
{
	printf("打开文件 %s 失败.\n", agrv[1]);
	getchar();
	return 0;
}

WSADATA WSAData;
WSAStartup(MAKEWORD(2, 0), &WSAData);

int Sockfd = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(2020);
sin.sin_addr.s_addr	= INADDR_ANY;//dwBindIp

if (bind(Sockfd, (struct sockaddr*) &sin, sizeof(sin)) < 0)
{
	printf("服务绑定端口%d失败,请检查端口是否被其他服务占用!\n", 2020);
	closesocket(Sockfd);
	return -1;
}

struct sockaddr_in dst;
memset(&dst, 0, sizeof(dst));
dst.sin_family = AF_INET;
dst.sin_addr.s_addr = inet_addr("1.2.3.4");;
dst.sin_port = htons(2021);

char *buf = new char[64 * 1024];
int addr_len = sizeof(dst);
unsigned short rtp_len;
while (true)
{
	if (2 != fread(&rtp_len, 1, 2, fp))
		break;
	rtp_len = ntohs(rtp_len);
	printf("+++rtp_len:%d\n",rtp_len);
	if (rtp_len != fread(buf, 1, rtp_len, fp))
		break;
	printf("+++rtp_len1:%d\n",rtp_len);
	sendto(Sockfd, buf, rtp_len, 0, (sockaddr*)&dst, addr_len);
	Sleep(1);
}
printf("转换完毕.\n");
delete buf;
return 0;

}*/

config.ini配置文件
[FILTERINFO]
SRC_IP = 172.16.65.92
SRC_PORT = 554

DST_IP = 172.16.64.86
DST_PORT = 13591

[SENDINFO]
DST_IP = 172.16.131.171
DST_PORT = 50000

SRC_IP = 172.16.64.84
SRC_PORT = 59001

[FILE]
NAME = “rtsp_tcp2.pcap”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

wirshark发包工具源码 的相关文章

  • 如何在线剪辑视频?手机视频怎样剪辑?

    在这个短视频当道的时代 大家都开始随手录制视频记录生活 一个视频从录制到发布 中间不可缺少的环节就是对视频的剪辑 想要做出高质量的视频 就少不了要在视频剪辑这一方面下功夫 有视频剪辑经验的小伙伴自然会选择使用PR等富有技术含量的软件 但是对
  • (ffmpeg)ffmpeg+SDL的简单播放器(雷霄骅)更新版

    代码源自雷神 一个是播放音频的demo 可以播放MP3和AAC 但是MP3应该是没有封面的 另一个是播放ts格式的视频 没有声音 源码可以到雷神博客下载 但是因为ffmpeg库的更新问题 并不能直接在ubuntu下直接运行 笔者做了修改 在
  • Unity平台如何实现RTSP转RTMP推送?

    技术背景 Unity平台下 RTSP RTMP播放和RTMP推送 甚至包括轻量级RTSP服务这块都不再赘述 今天探讨的一位开发者提到的问题 如果在Unity下 实现RTSP播放的同时 随时转RTMP推送出去 RTSP转RTMP 在原生环境下
  • HDMI之EDID使用说明

    Q1 为什么要写这篇文章 A1 在最近的工作中遇到了不少问题 其中很多都是和EDID相关的 可以说 作为一家以 显示 为生的企业 我们时时刻刻在与EDID打交道 EDID这东西很简单 但是如果不了解其基本原理和概念的话 会给我们的工作带来不
  • 视频无损放大修复工具:Topaz Video AI对Mac和Windows的系统要求

    Topaz Video AI是一款基于人工智能技术的视频增强软件 旨在提供高质量的视频修复 增强和转换功能 它可以通过智能算法和图像处理技术 改善视频的清晰度 稳定性 降噪效果 还能进行视频转码和格式转换 Mac Topaz Video A
  • 基于MediaPlayer实现视频播放

    一 概述 一个简单的视频播放器 满足一般的需求 使用原生的 MediaPlayer 和 TextureView来实现 功能点 获取视频的首帧进行展示 网络视频的首帧会缓存 视频播放 本地视频或者网络视频 感知生命周期 页面不可见自动暂停播放
  • Android:播放UDP流例如udp://@239.0.0.3:8218

    成功实现播放udp github下载 求大佬们给个star GitHub YangWenlong71 udpplayer 基于ijk重新编译 未做删减几乎全能的安卓视频播放器 支持播放UDP https http 等 分割线 研究思路及结果
  • 如何用视频制作gif动图?4种制作教学方法

    GIF动图以循环播放的形式呈现 相比于完整的视频内容 它可以将重要的瞬间或关键帧提取出来 从而简化和精简内容 所以说 动图比我们原本的视频文件呈现的内容更为活泼 生动 通过视频制作GIF动图 我们还可以运用编辑工具对视频中的场景进行裁剪 缩
  • 利用 FFmpeg 批量自动生成视频封面

    最近有一个 H5 页面的需求 里面有非常多的视频 由于视频在 H5 中播放缓冲较慢 因此需要在每一个视频前面加上一个封面 从而来避免白屏的情况 主要使用的 ffmpeg 的语法 ffmpeg i input mp4 ss 00 00 00
  • public static void main(String[] args) { //填入通过分享获取到的抖音视频地址 String videoUrl = getVid...

    这段代码的作用是从抖音 douyin 分享链接中获取视频的无水印播放地址 首先 它通过调用 HttpRequest get url 方法获取抖音视频的分享页面的 HTML 源代码 然后 通过调用 sub 方法并传入 HTML 源代码 开始字
  • 浏览器播放rtsp视频流:3、rtsp转webrtc播放

    浏览器播放rtsp视频流 3 rtsp转webrtc播放 文章目录 浏览器播放rtsp视频流 3 rtsp转webrtc播放 1 前言 2 rtsp转webRTC 3 初步测试结果 4 结合我们之前的onvif gSoap cgo的方案做修
  • SDL无法打开音频设备的问题:Couldn‘t open audio/video device: No available audio/video device

    解决中标麒麟下SDL无法打开音频设备的问题 root登录 首先就是一定要用root登录 这个可能是权限问题 否则后面实验不能成功 安装ALSA库 首先下载alsa lib https www alsa project org main in
  • RTSP,RTP,RTCP协议

    一 RTSP 1 简介 实时流传输协议 是一个应用层协议 TCP IP网络体系中 它是一个多媒体播放控制协议 主要用来使用户在播放流媒体时可以像操作本地的影碟机一样进行控制 即可以对流媒体进行暂停 继续 后退和前进等控制 RTSP体系结位于
  • Downie 4 4.6.12 MAC上最好的一款视频下载工具

    Downie for Mac 简介 Downie是Mac下一个简单的下载管理器 可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们 Downie 4 Downie 4 for Mac Downie
  • STM32之音频数据的Flash读取与DAC播放

    文章目录 一 STM32103之内部Flash原理 1 Flash介绍 2 Flash的组成 3 STM32内部框架图 二 SD卡的读写 1 实验过程 2 查看hello txt 3 从SD卡里读出数据 三 Flash地址空间的数据读取 1
  • (十)老照片修复、图像超分、图片提高分辨率、图片高清化、图片清晰化、黑白图片上色、人脸祛斑、美颜、人体瘦身、图像去噪、人像抠图、批量处理、视频提高分辨率、视频逐帧修复

    十 老照片修复 图像超分 图片提高分辨率 图片高清化 图片清晰化 黑白图片上色 人脸祛斑 美颜 人体瘦身 图像去噪 人像抠图 批量处理 视频提高分辨率 视频逐帧修复 本文的代码的功能是 可以对图片文件 视频批量增强清晰度 对老照片进行修复
  • 电动车低速提示音系统(AVAS)

    随着电动汽车的迅速发展 以及电动汽车的保有量也越来越多 根据车辆的特征来说电动汽车相比于传统的内燃机汽车要安静 为了保护行人 减少事故的发生 欧盟最近发布了一项关于电动车的新法规 自2019年7月1日开始 欧盟关于电动汽车的最新法律正式生效
  • 多业务光端机的技术进展与应用策略

    随着光通信技术的飞速发展 多业务光端机已成为现代通信网络不可或缺的一部分 这种设备能够在单一平台上处理多种类型的信号 包括语音 数据和视频等 极大地提高了网络的灵活性和效率 本文将探讨多业务光端机的最新技术进展和在实际应用中的策略 技术进展
  • 有没有实用的视频、图片素材网站推荐?

    在作品创作中 素材网站扮演着至关重要的角色 它们提供了海量的设计资源 为设计师 艺术家和创意工作者提供了无限的可能性 本文将为您介绍几款备受推崇的素材网站 帮助您开启创意之旅 一 制片帮素材 制片帮素材是一个提供海量精品视频素材的网站 站内
  • Waves14 Complete Mac/win功能强大、效果出色的专业级插件集合

    在现代音频制作中 音频效果器扮演着至关重要的角色 它们能够为音频注入独特的魅力和个性 让作品更加出彩 而在众多音频效果器中 Waves14 Complete音频效果器套件无疑是一个不可或缺的利器 Waves14 Complete音频效果器套

随机推荐