Logo Logo
/// 

Encoderlösung für Livestreams



Noch was unklar? Dann in unserem Forum nachfragen!


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 = '';
}

int main(;)
{
int sockfd;
int len;
int i;
struct sockaddr in address;
int result;
char *dummy;
char buffer[65536];
char *request;

/* Build request string */

if (;strlen(;USERPASS)) {
char *userpassmalloc(;strlen(;USERPASS) 4);
char *userpmalloc(;strlen(;USERPASS) 4);
memset(;userpass,0,strlen(;USERPASS) 4);
memset(;userp,0,strlen(;USERPASS) 4);
strcpy(;userpass,USERPASS);
strcpy(;userp,USERPASS);
base64 encode(;userpass, userp, strlen(;USERPASS));
request = (;char *) malloc(;strlen(;REQUEST AUTH)
strlen(;URLPATH) strlen(;userp) 1);
sprintf(;request, REQUEST AUTH, URLPATH, userp);
free(;userpass);
free(;userp);
printf(;"%s",request);
} else {
request = (;char *) malloc(;strlen(;REQUEST)
strlen(;URLPATH) 1);
sprintf(;request, REQUEST, URLPATH);
}

/* Create a socket for the client. */

sockfd = socket(;PF INET, SOCK STREAM, 0);

/* Name the socket, as agreed with the server. */

address.sin family = AF INET;
address.sin addr.s addr = inet addr(;IPADDR);
address.sin port = htons(;PORTNUMBER);
len = sizeof(;address);

/* Now connect our socket to the server's socket. */

result = connect(;sockfd, (;struct sockaddr *)&address, len);

if(;result == -1)
{
perror(;"oops: Cannot connect to socket");
exit(;1);
}

/* We can now read/write via sockfd. */

/* Send request to network camera */

send(;sockfd, request, strlen(;request), 0);

free(;request);

/* Read 100000 bytes to get a couple of images. */

for(;i0; i<100000;)
{
dummy = buffer;
/* read as much as is possible for a read
* if less is available: don't worry, read will return
* what is available
*/
int n = read(;sockfd, buffer, 65536);

/* read failed? */
if (;n == -1)
{
/* read was interrupted? then just do it
* again
*/
if (;errno == EINTR)
continue;

exit(;1);
}
/* n0 means socket is closed */
if (;n == 0)
break;

i = n;

/* send received buffer to stdout descriptor
* again: as much as possible so that you have
* not so much buffers
*/
while(;n > 0)
{
/* send some */
int nsend = write(;1, dummy, n);

if (;nsend == -1)
{
if (;errno == EINTR)
continue;

exit(;1);
}
/* strange: stdout is close?! */
else if (;nsend == 0)
exit(;1);

/* keep track of what was send */
dummy = nsend;
n -= nsend;
}
}

close(;sockfd);
exit(;0);
}





Antwort von Jens Peter Moeller:

sale@gee-gmbh.de schrieb:
> 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.

Ich weiß jetzt nicht und konnte das auf die Schnelle auch nicht
herausfinden, ob AviSnyth so einen Stream lesen kann, vielleicht
per DirectShowSource(;). Auf jeden Fall wäre das ein einfache Lösung.

Gruß
JPM





Noch was unklar? Dann in unserem Forum nachfragen!


Antworten zu ähnlichen Fragen:
HD Livestreaming per Livestream Broadcaster Box
Social-Media Integration in Livestream
Livestream mit externer Quelle
VLC Livestream
Livestream ins Internet
Sony A6000 OBS Livestream
Livestream von Sportevents - Musikrechte
WWDC 2017 - Livestream unter anderem hier
Livestream beim schneiden - Avid Output?
Erfahrung mit "Livestream Broadcaster Pro"
Camcorder für "Livestream" von Veranstaltungen
Livestream - Brauche Rat
Lehrreiche Livestreams für Filmemacher im Überblick -- Cine Live Guide
Suche Kameramann für HANNOVER MESSE 2016, 25. - 29. April für 1 Tag
Anbieter für Pinnacle Blue-oder Black-Box für DV500
1280x720 p auf DVD für TV-Wiedergabe und Bluray für Kinovorführung
Oscar 2018 für The Shape of Water, Best Cinematography für Roger Deakins
Objektiv für Panasonic Lumix G6, Für Nachtaufnahmen - Was ist Eure Empfehlung?
1000 euro budget - was kaufen für den anfang für bmpcc?
Anfänger Frage was für Cine Objektiv(e) für die BMPCC 6k?
Welches Zubehör für Canon C300 für dokumentarisches Arbeiten?
TV-Karte für PC mit Anschluss für Playstation - geht das?
Video drehen für den Chef / Neuland für mich
Allrounder bietet Mitarbeit für lau für Produktionen in Hessen
Shutterstock: Jahresabo für unbegrenzt viele lizenzfreie Soundtracks für 179 Euro
Lektüre-Empfehlung für die Feiertage: Leitfaden für DaVinci Resolve 16 Einsteiger

















weitere Themen:
Spezialthemen


16:9
3D
4K
ARD
ARTE
AVCHD
AVI
Adapter
Adobe After Effects
Adobe Premiere Pro
After effects
Akku
Akkus
Apple Final Cut Pro
Audio
Aufnahme
Aufnahmen
Avid
Band
Bild
Bit
Blackmagic
Blackmagic DaVinci Resolve
Blackmagic Design DaVinci Resolve
Blende
Book
Brennen
Cam
Camcorder
Camera
Canon
Canon EOS 5D MKII
Canon EOS C300
Capture
Capturing
Cinema
Clip
ClipKanal
Clips
Codec
Codecs
DSLR
Datei
Digital
ENG
EOS
Effect
Effekt
Effekte
Export
Fehler
Festplatte
File
Film
Filme
Filmen
Filter
Final Cut
Final Cut Pro
Firmware
Format
Formate
Foto
Frage
Frame
GoPro
HDMI
HDR
Hilfe
Import
JVC
Kabel
Kamera
Kanal
Kauf
Kaufe
Kaufen
Kurzfilm
Layer
Licht
Live
Lösung
MAGIX video deLuxe
MPEG
MPEG-2
MPEG2
Mac
Magix
Magix Vegas Pro
Menü
Mikro
Mikrofon
Mikrophone
Monitor
Movie
Musik
Musikvideo
NAB
Nero
News
Nikon
Objektiv
Objektive
PC
Panasonic
Panasonic GH2
Panasonic HC-X1
Panasonic S1 mit V-Log
Pinnacle
Pinnacle Studio
Player
Plugin
Plugins
Premiere
Projekt
RAW
RED
Recorder
Red
Render
Rendern
Schnitt
Software
Sony
Sound
Speicher
Stativ
Stative
Streaming
Studio
TV
Test
Titel
Ton
USB
Umwandeln
Update
Vegas
Video
Video-DSLR
Videos
Videoschnitt
Windows
YouTube
Zoom