Infoseite // Encoderlösung für Livestreams
Frage von sale@gee-gmbh.de:
Hallo,
ich habe mehrere IP-Kameras (;Axis und Enso), welche im MJPEG-Format
ihre Livestreams zur Verfügung stellen. Das ganze sieht bei der
Axis-Kamera z. B. so aus "http://192.168.6.90/axis-cgi/mjpg/video.cgi".
Ich möchte nun diese Signale mit einem Encoder abgreifen, z. B. den
Helix DNA Realproducer oder über MPEG4IP. Das Problem besteht nun in
der Übergabe des Livestreams an die Encoder. Diese können nur über
eine Capturekarte oder einen Dateinamen auf die Quellen zugreifen. Da
ich weder das eine noch das andere habe, komme ich an der Stelle nicht
weiter.
Nun zu meinen Ideen - ich kann über Sockets auf die Quellen zugreifen
und kann die gelesenen Daten auf die Platte schreiben als z. B.
out.mjpeg. Diese kann ich mir dann z. B. mit dem MPlayer ansehen.
Wie kann ich aber diese Daten an einen Encoder weitergeben? Hat jemand
dazu eine Idee oder gibt es schon Lösungen dazu? Ich habe mehrere Tage
gegoogelt und gesucht - aber ich komme zu keinem Ergebnis.
Es müsste doch irgendwie möglich sein dieses Problem zu lösen.
Ich habe mal den Quelltext eines Beispiels, welches ich im Netz
gefunden habe, angehängt. Damit kann ich eine kleine Datei anlegen und
diese dann lesen. Das Problem ist jedoch, das die Datei immer größer
wird - ich möchte aber keine Aufzeichnungen.
Ich würde mich freuen wenn mir hier weitergeholfen werden kann. Ich
habe auch noch nicht so tiefe Erfahrungen in der Programnmierung und
arbeite auch noch nicht allzu lange mit Linux. Benutzen tue ich Debian
in der aktuellen Version ohne X. Aber ich tue mein bestes.
mfg
Reiner
Hier der Quelltext:
#include
#include
#include
#include
#include
#include
#include
#include
#include
/* User defined parameters - EDIT HERE */
#define IPADDR "127.0.0.1" /* IP address of motion server, 127.0.0.1 =
localhost */
#define PORTNUMBER 80 /* Port number of camera */
#define URLPATH "/cam1/jpeg.jpg" /* path following ipadr and portno. */
#define USERPASS "" /* "username:password" */
/* End of user defined parameters */
#define REQUEST AUTH "GET %s HTTP/1.0 Authorization: Basic
%s "
#define REQUEST "GET %s HTTP/1.0 "
void base64 encode(;const char *s, char *store, int length)
{
/* Conversion table. */
static char tbl[64] = {
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', '0', '1', '2', '3',
'4', '5', '6', '7', '8', '9', ' ', '/'
};
int i;
unsigned char *p = (;unsigned char *) store;
/* Transform the 3x8 bits to 4x6 bits, as required by base64. */
for (;i = 0; i < length; i = 3) {
*p = tbl[s[0] >> 2];
*p = tbl[(;(;s[0] & 3) << 4) (;s[1] >> 4)];
*p = tbl[(;(;s[1] & 0xf) << 2) (;s[2] >> 6)];
*p = tbl[s[2] & 0x3f];
s = 3;
}
/* Pad the result if necessary... */
if (;i == length 1)
*(;p - 1) = '=';
else if (;i == length 2)
*(;p - 1) = *(;p - 2) = '=';
/* ...and zero-terminate it. */
*p = '