IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Stream ecran bureau + conversion flux MP4


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 63
    Points : 33
    Points
    33
    Par défaut Stream ecran bureau + conversion flux MP4
    Bonjour,

    Ayant cherché sur le web, mais rien trouvé, je me tourne vers vous.

    Pour mon application, j'ai besoin de streamer l'écran de mon bureau (Linux et Windows) et de transformer ce stream en une vidéo MP4 (l'agrandir à chaque fois).

    En fait, j'ai une application externe qui va lire une vidéo sur un serveur web, par exemple www.monsite.com/mavideo.mp4 (c'est moi qui l'uploade dessus).
    Donc j'aimerais faire pareil, mais avec une vidéo qui n'a pas de taille fixe, mais qui grandit au fur et à mesure (le stream de mon écran).

    Est-ce que c'est possible en C ?

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Tout est possible, en C. Le streaming, c'est pas une mince affaire. As-tu réfléchi au protocole ?

    Je te recommanderais de te tourner vers une combinaison d'outils RTP / RTSP / RTCP conçus par des professionnels et déjà éprouvés par des années d'usage intensif (voir la section Implementations).

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Merci pour ta réponse, mais ce que je veux là, c'est juste streamer mon bureau et encodé le flux en mp4 pour ensuite l'envoyer sur mon serveur web. Et lorsque je l'envoie sur mon serveur web, je lis le fichier en mode binaire et j'envoie ce que je lis...

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par AchilleFraisse Voir le message
    Merci pour ta réponse, mais ce que je veux là, c'est juste streamer mon bureau et encodé le flux en mp4 pour ensuite l'envoyer sur mon serveur web. Et lorsque je l'envoie sur mon serveur web, je lis le fichier en mode binaire et j'envoie ce que je lis...
    Ben oui mais la partie "lecture fichier + envoi" est assez triviale. Une boucle, un read() sur le fichier et un write() sur la socket et c'est réglé.

    Le vrai souci, c'est streamer ton bureau et c'est pour ça que Matt Houston t'a parlé de ces outils...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Oui, effectivement. J'ai donc commencer à regarder ce protocole, et j'ai trouvé cette article intéressant de VLC : http://techno.firenode.net/article.s...80405410822197
    Le client exécute donc cette commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cvlc screen:// --sout '#transcode{fps=30,vcodec=mp4v,vb=1024,width=1920,height=1080,acodec=mp4a,ab=128,channels=2}:rtp{mux=ts,ttl=10s,port=12546,sdp=http://192.168.1.12:12546}'
    Sauf que je ne reçois rien côté serveur...
    Voilà mon serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    int main(void)
    {
        int sock, clientlen, n, port = 12546;
        char buf[1024], *host;
     
        struct sockaddr_in serveraddr;
        struct sockaddr_in clientaddr;
        struct hostent *hostp;
     
        sock = socket(AF_INET, SOCK_DGRAM, 0);
     
        bzero((char *) &serveraddr, sizeof(serveraddr));
     
        serveraddr.sin_family = AF_INET;
        serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
        serveraddr.sin_port = htons((unsigned short)port);
     
        if(bind(sock, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0) 
            clientlen = sizeof(clientaddr);
     
        while (1)
        {
            bzero(buf, 1024);
     
            n = recvfrom(sock, buf, 1024, 0, (struct sockaddr *) &clientaddr, &clientlen);
     
            hostp = gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr, sizeof(clientaddr.sin_addr.s_addr), AF_INET);
     
            host = inet_ntoa(clientaddr.sin_addr);
     
            printf("%s\n" buf);
        }
     
        return 0;
    }

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par AchilleFraisse Voir le message
    Le client exécute donc cette commande :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    cvlc screen:// --sout '#transcode{fps=30,vcodec=mp4v,vb=1024,width=1920,height=1080,acodec=mp4a,ab=128,channels=2}:rtp{mux=ts,ttl=10s,port=12546,sdp=http://192.168.1.12:12546}'

    Sauf que je ne reçois rien côté serveur...
    Voilà mon serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main(void)
    {
        ...
        sock = socket(AF_INET, SOCK_DGRAM, 0);
        ...
        return 0;
    }
    T'es sûr que cvlc fonctionne en mode "datagrammes" ??? J'ai pas lu le lien que tu donnes mais d'instinct je serais plutôt parti sur du "SOCK_STREAM".

    En tout cas ton serveur en lui-même est correct. J'ai récupéré un client (qui fonctionne en mode "SOCK_DGRAM") d'exemple dans mes cours et l'ai adapté à ton serveur
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <sys/param.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <netdb.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define SERVEUR_DEFAULT		("localhost")
    #define SZ_BUF				(256)
     
    int main(
    	int argc,
    	char *argv[])
    {
    	ushort i;
    	ushort j;
     
    	int sk_dialog;
     
    	char buf[SZ_BUF];
    	char *pt;
    	char *serveur;
     
    	struct sockaddr_in adr_serveur;
    	struct hostent *host_info;
     
    	if (argc > 1)
    		serveur=argv[1];
    	else
    	{
    		serveur=SERVEUR_DEFAULT;
    		printf("Pas d'argument pour %s - Utilisation de %s\n", *argv, serveur);
    	}
     
    	if ((host_info=gethostbyname(serveur)) == NULL)
    	{
    		fprintf(stderr, "ligne %u - gethostbyname(%s) - %s\n", __LINE__, serveur, strerror(errno));
    		exit(errno);
    	}
    	fputc('\n', stdout);
    	printf("host_info.h_name='%s'\n", host_info->h_name);
    	for (i=0; host_info->h_aliases[i] != NULL; i++)
    		printf("host_info.h_aliase[%hu]='%s'\n", i, host_info->h_aliases[i]);
    	printf("host_info.h_addrtype=%u\n", host_info->h_addrtype);
    	printf("host_info.h_length=%u\n", host_info->h_length);
    	for (i=0; host_info->h_addr_list[i] != NULL; i++)
    	{
    		printf("host_info.h_addr_list[%hu]=", i);
    		for (j=0; j < host_info->h_length; j++)
    			printf("%hu ", (unsigned char)host_info->h_addr_list[i][j]);
    		fputc('\n', stdout);
    	}
     
    	if ((sk_dialog=socket(AF_INET, SOCK_DGRAM, 0)) == (-1))
    	{
    		fprintf(stderr, "ligne %u - socket() - %s\n", __LINE__, strerror(errno));
    		exit(errno);
    	}
    	printf("Socket créée\n");
     
    	memset(&adr_serveur, 0, sizeof(struct sockaddr_in));
    	adr_serveur.sin_family=AF_INET;
    	adr_serveur.sin_port=htons(12546);
    	memcpy(&adr_serveur.sin_addr.s_addr, host_info->h_addr, host_info->h_length);
     
    	do
    	{
    		fputs("Entrer chaine (EOT pour finir) :", stdout); fflush(stdout);
    		fgets(buf, SZ_BUF, stdin);
     
    		if ((pt=strchr(buf, '\n')) != NULL) *pt='\0';
     
    		if (sendto(sk_dialog, buf, strlen(buf) + 1, 0, (struct sockaddr*)&adr_serveur, sizeof(struct sockaddr_in)) == (-1))
    			fprintf(stderr, "ligne %u - sendto(%s) - %s\n", __LINE__, buf, strerror(errno));
    	}
    	while (strcmp(buf, "EOT") != 0);
     
    	close(sk_dialog);
    	return(0);
    }
    Il a fonctionné sans souci (et ton serveur lit et affiche bien ce que mon client lui envoie). Donc ça ne vient pas de lui...

    Au cas où tu devrais essayer un serveur "SOCK_STREAM". Tu peux en trouver un en exemple dans un de mes vieux cours (p. 38 à 43)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Dac, merci pour ton message.
    Mais après, si je veux mettre un vlc côté client pour décoder le flux rtsp, je fais comment ?

Discussions similaires

  1. Un lecteur de Streaming JAVA pour les flux OGG
    Par kmdkaci dans le forum Mon programme
    Réponses: 1
    Dernier message: 10/10/2011, 01h23
  2. DirectShow - Conversion flux webcam en RGB
    Par shadma dans le forum DirectX
    Réponses: 8
    Dernier message: 18/02/2010, 18h17
  3. Conversion flux binaire -> ascii -> hexa
    Par identifiant_bidon dans le forum C++
    Réponses: 15
    Dernier message: 15/11/2007, 09h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo