Отображение нескольких OpenCv IplImages через видеовыход VLC

Я пытаюсь отправить несколько кадров (предварительно взятых из реального видеофайла) через сокет (C ++), чтобы затем воспроизвести с VLC.

Я много искал и не нашел решения. Надеюсь, ты сможешь мне помочь.

Итак, это мой код:

#include <stdio.h>
#include <stdlib.h>
#include <direct.h>
#include <iostream>
#include <WinSock2.h>
#include <Windows.h>
#include <iostream>
#include <string.h>
#include <time.h>
#include <errno.h>
//#include <fstream>

#include <opencv2/core/core.hpp>        // Basic OpenCV structures (cv::Mat, Scalar)
#include <opencv2/highgui/highgui.hpp>  // OpenCV window I/O

using namespace std;

#define PORT 6666
#define GROUP "127.0.0.1"//#define INADDR_ANY

int serversock, clientsock;
int is_data_ready = 0;
struct sockaddr_in server, client;
int bytes = 0;
int count = 0;

int addrlen = sizeof(server);
int clielen = sizeof(client);

int opt = 1;

//methods
void quit(char* msg, int retval);

void quit(char* msg, int retval)
{
if (retval == 0) {
fprintf(stdout, (msg == NULL ? "" : msg));
fprintf(stdout, "\n");
} else {
fprintf(stderr, (msg == NULL ? "" : msg));
fprintf(stderr, "\n");
}

if (clientsock) closesocket(clientsock);

if (serversock) closesocket(serversock);

exit(retval);
}

int main()
{
// Initialize Winsock
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
wprintf(L"WSAStartup failed with error: %ld\n", iResult);
return 1;
}

//char *imgname; //path e nome das imagens
int i=0;
char filename[50];
IplImage *img = cvLoadImage(<path\\imgname.jpg); //1ª imagem como referência
//IplImage *img2;
CvSize size;
size.width = img->width;
size.height = img->height;

/* setup server's IP and port */
memset(&server,0,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(6666/*PORT*/);
server.sin_addr.s_addr = inet_addr("127.0.0.1"/*GROUP*/);
//server.sin_addr.s_addr = INADDR_ANY;

SOCKET serversock = socket(AF_INET, SOCK_STREAM, 0);
//SOCKET t;
//t = socket(AF_INET, SOCK_STREAM,NULL);

if (serversock < 0) { // or == -1
wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
WSACleanup();
//quit("socket() failed", 1);
}

/* bind the socket */
int b = bind(serversock, (const sockaddr*)&server, sizeof(server));
if (b < 0) {
wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
WSACleanup();
quit("bind() failed", 1);
}

/* wait for connection */
int l = listen(serversock, 5);
if(l < 0) {
quit("listen() failed.", 1);
}

setsockopt(serversock, SOL_SOCKET, SO_KEEPALIVE, (const char*) &opt, sizeof(int));

while(img != NULL)
{
sprintf(filename, "filter\\frame_%d.jpg", i);

img = cvLoadImage(filename);

if (img) {
int imgSize = (int) &size;
sendto(serversock, img->imageData, imgSize, 0, (const struct sockaddr*)&server, addrlen);
if(bytes < 0) { //error
wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
WSACleanup();
quit("sendto FAILED", 1);
}

//end socket stuff

cout << "Image sent!" << endl;
}
i++;
}
cvReleaseImage(&img);
}

Затем я открываю VLC и настраиваю его на прием сетевого потока по следующему адресу: rtp://127.0.0.1:6666,

Приложение заканчивается, и VLC ничего не показывает.

Большое спасибо!

0

Решение

Первый,

int sendto(
_In_  SOCKET s,
_In_  const char *buf,
_In_  int len,
_In_  int flags,
_In_  const struct sockaddr *to,
_In_  int tolen
);

sendto третий аргумент « The length, in bytes, of the data pointed to by the buf parameter », а не адрес какого-либо объекта размера OpenCV. Так что не удивительно, если ваша программа падает. imgSize должно быть img.imageSize,

во-вторых, Я действительно сомневаюсь, что VLC способен декодировать поток, состоящий из нескольких необработанных данных изображений, я уверен, что ему необходим некоторый потоковый протокол.

Сначала вам нужно использовать транспорт протокол как протокол потоковой передачи (HTTP, RTP и т. Д.).
Затем вам нужно создать реальное видео для потоковой передачи (MJPEG, MPEG4 и т. Д.)

Ваш сервер может относительно легко транслировать MJPEG по HTTP, для любого другого протокола вы должны использовать внешнюю библиотеку.

Вы должны искать около как реализовать сервер потокового видео в C ++, увидеть эту тему: Как начать реализацию сервера потокового видео в c / c ++?

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]