FlashCom+&Asp/Asp.Net 实现WEB视频聊天

本文介绍了一种使用 FlashCom 实现的实时音视频通信系统。系统通过客户端与服务器之间的交互实现双向音视频流传输,包括摄像头和麦克风数据的获取、发送及接收,并详细展示了相关代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要安装 flashcom 测试版本可以在media上下载。

代码如下:

[JaSoft.Aspx]

<%@Language=" C#"%> 
<script runat="server"> 

private void Page_Load(object sender, System.EventArgs e) 

Response.Write("conn=1&Sendid="+Session["ziyan"]+"&Recvid="+Session["sammi"]); 

</script> 


[View.Aspx]

<%@ Page Language=" C#" %> 
<script runat="server"> 

private void Page_Load(object sender, System.EventArgs e) 

Session["ziyan"]=Request.QueryString["RecvId"]; 
Session["sammi"]=Request.QueryString["Sendid"]; 

</script> 
<html> 
<head> 
<meta http-equiv="Content-Language" content="zh-cn"> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
<title>无标题文档</title> 
</head> 

<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<div align="center">
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-44553540000" 
codebase=  http://download.macromedia.com/pub/shockwave
/cabs/flash/swflash.cab#version=6,0,29,0 width="500" height="500">
<param name="menu" value="false">
<param name="movie" value="JaSoft.swf">
<param name="quality" value="high">
<embed src="JaSoft.swf" quality="high" pluginspage=
http://www.macromedia.com/go/getflashplayer 
type="application/x-shockwave-flash" width="500" height="500"> </embed></object>
</div>
</body> 
</html> 

[JaSoft.Swf]

stop(); 
myCam = Camera.get();
myVideoObject.attachVideo(myCam);
myCam.onStatus = function(infoMsg) {

if(infoMsg.code == "Camera.Muted"){
_root.a.text="User denies access to the camera";
}
else
System.showSettings(0);
}


client_nc = new NetConnection(); 

client_nc.onStatus = function(info) { 
trace("Level: "+info.level+newline+"Code: "+info.code); 
_root.abc.text = "Level: "+info.level+newline+"Code: "+info.code;
}; 

client_nc.connect("rtmp://192.168.25.18/record_video"); 

rec_so = SharedObject.getRemote("myvideo", client_nc.uri, true); 


rec_so.connect(client_nc); 
var Recvid; 
var Sendid; 
GetId(); 
function Recv() { 

in_ns = new NetStream(client_nc); 

in_ns.play(Recvid); 
_root.b.attachVideo(in_ns); 


function Send() { 
this.cam = Camera.get(); 
this.mic = Microphone.get(); 
out_ns = new NetStream(client_nc); 

out_ns.attachVideo(this.cam); 
_root.a.attachVideo(this.cam); 

out_ns.attachAudio(this.mic); 
out_ns.publish(Sendid, "live"); 


function GetId(){ 
myload = new LoadVars(); 

myload.action = "post"; 

myload.onLoad = function(success) { 

if (success) { 

if (this.conn == "1") { 
_root.Recvid = this.Recvid; 
_root.Sendid = this.Sendid; 
Send(); 
Recv(); 
_root.abc.text =’ok...’; 

} else { 
//如果和服务器连接不成功则返回失败消息,需要检查路径是否正确 
_root.abc.text = ’连接不成功....’;

}; 
myload.sendAndLoad(" http://192.168.25.18/Asp.Net/JaSoft.aspx", myload, "post"); 


#include"SPI.h" #include"GPIODrv.h" //初始化 void SPI_FLASH_Init(void) { //配置管脚复用 GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SPI3); GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SPI3); GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SPI3); //配置GPIO GPIO_InitTypeDef GPIO_InitStructure; //PA7 SPI3_WP GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIOA->BSRRH = 0x80;//PA7 = 0 //PA15 JTDI/SPI3_NSS GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIOA->BSRRH = 0x8000;//PA15 = 0 //0x8000;//PA15 = 0 //PB10 SPI3_HOLD GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIOB->BSRRH = 0x400;//PB10 = 0 //PC10 SPI3_SCK GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); //PC11 SPI3_MISO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOC, &GPIO_InitStructure); //PC12 SPI3_MOSI GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIOC->BSRRH = 0x1C00;//PC10 = 0 PC11 = 0 PC12 = 0 /*开启时钟*/ RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN | RCC_AHB1ENR_GPIOCEN;// 使能GPIO时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE); //开启SPI1的时钟 /*SPI初始化*/ SPI_InitTypeDef SPI_InitStructure; //定义结构体变量 SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //模式,选择为SPI主模式 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //方向,选择2线全双工 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //数据宽度,选择为8位 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //先行位,选择高位先行 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; //波特率分频,选择128分频 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //SPI极性,选择低极性 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //SPI相位,选择第一个时钟边沿采样,极性和相位决定选择SPI模式0 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS,选择由软件控制 SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC多项式,暂时用不到,给默认值7 SPI_Init(SPI3, &SPI_InitStructure); //将结构体变量交给SPI_Init,配置SPI1 /*SPI使能*/ SPI_Cmd(SPI3, ENABLE); //使能SPI1,开始运行 /*设置默认电平*/ MySPI_Stop(); //SS默认高电平 } //SPI开始 void MySPI_Start(void) { GPIOA -> ODR &= ~(1 << 15); } //SPI终止 void MySPI_Stop(void) { GPIOA -> ODR |= (1 << 15); } //SPI交换传输一个字节 uint8_t MySPI_SwapByte(uint8_t ByteSend) { while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) != SET); //等待发送数据寄存器空 SPI_I2S_SendData(SPI3, ByteSend); //写入数据到发送数据寄存器,开始产生时序 while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) != SET); //等待接收数据寄存器非空 return SPI_I2S_ReceiveData(SPI3); //读取接收到的数据并返回 } /** * 函 数:MPU6050读取ID号 * 参 数:MID 工厂ID,使用输出参数的形式返回 * 参 数:DID 设备ID,使用输出参数的形式返回 * 返 回 值:无 */ void SPI_FLASH_Read_ID(uint8_t *MID, uint16_t *DID) { MySPI_Start(); //SPI起始 MySPI_SwapByte(W25Q64_JEDEC_ID); //交换发送读取ID的指令 *MID = MySPI_SwapByte(W25Q64_DUMMY_BYTE); //交换接收MID,通过输出参数返回 *DID = MySPI_SwapByte(W25Q64_DUMMY_BYTE); //交换接收DID高8位 *DID <<= 8; //高8位移到高位 *DID |= MySPI_SwapByte(W25Q64_DUMMY_BYTE); //或上交换接收DID的低8位,通过输出参数返回 MySPI_Stop(); //SPI终止 } /** * 函 数:W25Q64写使能 * 参 数:无 * 返 回 值:无 */ void SPI_FLASH_Write_Enable(void) { MySPI_Start(); //SPI起始 MySPI_SwapByte(W25Q64_WRITE_ENABLE); //交换发送写使能的指令 MySPI_Stop(); //SPI终止 } /** * 函 数:W25Q64等待忙 * 参 数:无 * 返 回 值:无 */ void W25Q64_WaitBusy(void) { uint32_t Timeout; MySPI_Start(); //SPI起始 MySPI_SwapByte(W25Q64_READ_STATUS_REGISTER_1); //交换发送读状态寄存器1的指令 Timeout = 100000; //给定超时计数时间 while ((MySPI_SwapByte(W25Q64_DUMMY_BYTE) & 0x01) == 0x01) //循环等待忙标志位 { Timeout --; //等待时,计数值自减 if (Timeout == 0) //自减到0后,等待超时 { /*超时的错误处理代码,可以添加到此处*/ break; //跳出等待,不等了 } } MySPI_Stop(); //SPI终止 } /** * 函 数:W25Q64扇区擦除(4KB) * 参 数:Address 指定扇区的地址,范围:0x000000~0x7FFFFF * 返 回 值:0 */ int32_t SPI_FLASH_Erase_Sector(uint32_t Address) { SPI_FLASH_Write_Enable(); //写使能 MySPI_Start(); //SPI起始 MySPI_SwapByte(W25Q64_SECTOR_ERASE_4KB); //交换发送扇区擦除的指令 MySPI_SwapByte(Address >> 16); //交换发送地址23~16位 MySPI_SwapByte(Address >> 8); //交换发送地址15~8位 MySPI_SwapByte(Address); //交换发送地址7~0位 MySPI_Stop(); //SPI终止 W25Q64_WaitBusy(); //等待忙 return SUCCESS; } /** * 函 数:W25Q64页编程 * 参 数:Address 页编程的起始地址,范围:0x000000~0x7FFFFF * 参 数:DataArray 用于写入数据的数组 * 参 数:Count 要写入数据的数量,范围:0~256 * 返 回 值:0 * 注意事项:写入的地址范围不能跨页 */ int32_t SPI_FLASH_WriteData(uint32_t Address, uint8_t *DataArray, uint16_t Count) { uint16_t i; SPI_FLASH_Write_Enable(); //写使能 MySPI_Start(); //SPI起始 MySPI_SwapByte(W25Q64_PAGE_PROGRAM); //交换发送页编程的指令 MySPI_SwapByte(Address >> 16); //交换发送地址23~16位 MySPI_SwapByte(Address >> 8); //交换发送地址15~8位 MySPI_SwapByte(Address); //交换发送地址7~0位 for (i = 0; i < Count; i ++) //循环Count次 { MySPI_SwapByte(DataArray[i]); //依次在起始地址后写入数据 } MySPI_Stop(); //SPI终止 W25Q64_WaitBusy(); //等待忙 return SUCCESS; } /** * 函 数:W25Q64读取数据 * 参 数:Address 读取数据的起始地址,范围:0x000000~0x7FFFFF * 参 数:DataArray 用于接收读取数据的数组,通过输出参数返回 * 参 数:Count 要读取数据的数量,范围:0~0x800000 * 返 回 值:0 */ int32_t SPI_FLASH_Read_Data(uint32_t Address, uint8_t *DataArray, uint32_t Count) { uint32_t i; MySPI_Start(); //SPI起始 MySPI_SwapByte(W25Q64_READ_DATA); //交换发送读取数据的指令 MySPI_SwapByte(Address >> 16); //交换发送地址23~16位 MySPI_SwapByte(Address >> 8); //交换发送地址15~8位 MySPI_SwapByte(Address); //交换发送地址7~0位 for (i = 0; i < Count; i ++) //循环Count次 { DataArray[i] = MySPI_SwapByte(W25Q64_DUMMY_BYTE); //依次在起始地址后读取数据 } MySPI_Stop(); //SPI终止 return SUCCESS; } #include"SPI.h" #include"GPIODrv.h" #include"FLASHCom.h" void Flash_RW_Test(void) { uint8_t mid; uint16_t did; uint8_t write_data[DATA_SIZE]; uint8_t read_data[DATA_SIZE]; // 步骤1: 验证芯片连接 SPI_FLASH_Read_ID(&mid, &did); DEBUG("Manufacturer ID: 0x%02X, Device ID: 0x%04X\r\n", mid, did); // 步骤2: 擦除目标扇区(4KB) int32_t erase = SPI_FLASH_Erase_Sector(TEST_ADDRESS); if( erase ) {//错误处理 DEBUG("Sector erased at 0x%06X\r\n", TEST_ADDRESS); } DEBUG("erase ok\r\n"); // 步骤3: 准备测试数据 for(int i=0; i<DATA_SIZE; i++) { write_data[i] = i % 256; // 生成0-255循环数据 } // 步骤4: 写入数据(页编程) int32_t write = SPI_FLASH_WriteData(TEST_ADDRESS, write_data, DATA_SIZE); if( write ) {//错误处理 DEBUG("Data written to address 0x%06X\r\n", TEST_ADDRESS); } // 步骤5: 读取验证 int32_t read = SPI_FLASH_Read_Data(TEST_ADDRESS, read_data, DATA_SIZE); if( read ) {//错误处理 ; } // 步骤6: 数据校验 int error_count = 0; for(int i=0; i<DATA_SIZE; i++) { if(read_data[i] != write_data[i]) { DEBUG("Error at byte %d: Wrote 0x%02X, Read 0x%02X\r\n", i, write_data[i], read_data[i]); error_count++; } } if(error_count == 0) { DEBUG("Flash R/W test successful!\n"); } else { DEBUG("%d verification errors detected!\n", error_count); } } 在最后的输出结果部分出现问题,输出结果是Manufacturer ID: 0xFF, Device ID: 0xFFFF Error at byte 0: Wrote 0x00, Read 0xFF Error at byte 1: Wrote 0x01, Read 0xFF Error at byte 2: Wrote 0x02, Read 0xFF Error at byte 3: Wrote 0x03, Read 0xFF Error at byte 4: Wrote 0x04, Read 0xFF Error at byte 5: Wrote 0x05, Read 0xFF Error at byte 6: Wrote 0x06, Read 0xFF Error at byte 7: Wrote 0x07, Read 0xFF Error at byte 8: Wrote 0x08, Read 0xFF Error at byte 9: Wrote 0x09, Read 0xFF,怎么解决
最新发布
07-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值