Hii everyone I am trying to send video and audio over udp to the server. Till now I am successfully sending the video in rtp packets but for audio I am getting issues i can not get the input of the mic and send the packets.
here I am giving my code for video part. Any help in sending the audio with this video will me much appriciated.
Thanks !!
#include <WiFi.h>
#include <WiFiUdp.h>
#include “VideoStream.h”
#define CHANNEL 0
VideoSetting config(1920, 1080, CAM_FPS, VIDEO_JPEG, 1);
char ssid = “ssid”;
char pass = “pass”;
WiFiUDP udp;
IPAddress serverIP(192, 168, 31, 68);
const uint16_t serverPort = 4000;
uint32_t img_addr = 0;
uint32_t img_len = 0;
uint16_t sequenceNumber = 0;
uint32_t timestamp = 0;
uint32_t ssrc = 0x12345678;
void buildRTPHeader(uint8_t* header, uint16_t seq, uint32_t ts, bool marker) {
header[0] = 0x80; // Version 2
header[1] = 26 | (marker ? 0x80 : 0x00); // PT = 26 for MJPEG
header[2] = seq >> 8;
header[3] = seq & 0xFF;
header[4] = ts >> 24;
header[5] = ts >> 16;
header[6] = ts >> 8;
header[7] = ts & 0xFF;
header[8] = ssrc >> 24;
header[9] = ssrc >> 16;
header[10] = ssrc >> 8;
header[11] = ssrc & 0xFF;
}
void sendJPEGasRTP(uint8_t* jpeg, uint32_t len) {
const uint32_t maxPayloadSize = 1400; // for safe MTU
uint32_t offset = 0;
timestamp += 3600; // simulate 25fps
while (offset < len) {
uint32_t payloadLen = min(maxPayloadSize, len - offset);
bool marker = (offset + payloadLen) >= len;
uint8_t packet[1500]; // 12 + 8 + 1400 max
// RTP Header (12 bytes)
buildRTPHeader(packet, sequenceNumber++, timestamp, marker);
// MJPEG RTP header (8 bytes) per RFC 2435
uint8_t* mjpegHeader = packet + 12;
mjpegHeader[0] = 0; // Type-specific
mjpegHeader[1] = (offset >> 16) & 0xFF;
mjpegHeader[2] = (offset >> 8) & 0xFF;
mjpegHeader[3] = offset & 0xFF;
mjpegHeader[4] = 1; // Type
mjpegHeader[5] = 0; // Q
mjpegHeader[6] = 1920 / 8; // Width in 8-pixel blocks
mjpegHeader[7] = 1080 / 8; // Height in 8-pixel blocks
// Copy JPEG data
memcpy(packet + 12 + 8, jpeg + offset, payloadLen);
// ✅ Send packet via UDP
udp.beginPacket(serverIP, serverPort);
udp.write(packet, 12 + 8 + payloadLen);
udp.endPacket();
offset += payloadLen;
delay(1); // pacing
}
}
void setup() {
Serial.begin(115200);
while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
delay(5000);
}
Serial.println(WiFi.localIP());
Camera.configVideoChannel(CHANNEL, config);
Camera.videoInit();
Camera.channelBegin(CHANNEL);
udp.begin(12345); // Any local port
}
void loop() {
Camera.getImage(CHANNEL, &img_addr, &img_len);
sendJPEGasRTP((uint8_t*)img_addr, img_len);
delay(40); // ~25fps
}