Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di Luca_89
    Registrato dal
    Sep 2005
    Messaggi
    128

    [C#]Metodo programmazione webcam streaming

    Salve a tutti..
    è da tanto che cerco una soluzione per trasmettere dal pc A al pc B l'immagine della cam in streaming.. ho provato RTP e anche il windows media encoder ( ma non ho capito sinceramente come fare ad avere un server dove ricevere se non comprandolo e costa tanto! ) quindi l'ho subito escluso.. ho provato quindi a farlo da me..
    prendevo ogni frame e lo inviavo via rete tramite TCP... andava ma lentissimo .. (ricevevo le immagini di parecchi minuti prima)..
    allora ho creato tre thread che trasmettono su tre socket diversi..
    in pratica ogni frame lo inserisco nelle varie code (ad uno ad uno in tutte le code) e da thread diversi le invio.. il risultato è stato buono anche se forse ottenendo il risultato contrario .. ( la lista si svuota troppo velocemente e alcune volte non ha frame da inviare )..
    comunque volevo chiedervi come vi sembra questo metodo??

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Moderazione

    Originariamente inviato da Luca_89
    Salve a tutti..
    è da tanto che cerco una soluzione per trasmettere dal pc A al pc B l'immagine della cam in streaming.. ho provato RTP e anche il windows media encoder ( ma non ho capito sinceramente come fare ad avere un server dove ricevere se non comprandolo e costa tanto! ) quindi l'ho subito escluso.. ho provato quindi a farlo da me..
    prendevo ogni frame e lo inviavo via rete tramite TCP... andava ma lentissimo .. (ricevevo le immagini di parecchi minuti prima)..
    allora ho creato tre thread che trasmettono su tre socket diversi..
    in pratica ogni frame lo inserisco nelle varie code (ad uno ad uno in tutte le code) e da thread diversi le invio.. il risultato è stato buono anche se forse ottenendo il risultato contrario .. ( la lista si svuota troppo velocemente e alcune volte non ha frame da inviare )..
    comunque volevo chiedervi come vi sembra questo metodo??
    Non c'è codice sorgente da valutare, né un problema specifico di cui discutere.
    Cosa dovremmo dire a riguardo?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di Luca_89
    Registrato dal
    Sep 2005
    Messaggi
    128
    Scusate.. in effetti all'inizio volevo un parere sul "metodo" aldilà del codice.. comunque vi posto il codice, che per me è anzi molto meglio

    Ho AForge.NET che mi inizializza la webcam e mi da, sotto forma di evento, ogni frame catturato..(Webcam.videosource.NewFrame)

    eppoi la classe che manda il tutto che è questa
    Nell'invio vero e proprio aspetto il messaggio "sendframe".. se ce l'ho posso inviare il frame e allora prima mando un mess "sendsize" informando l'altra macchina che sto per inviare la grandezza.. poi invio la grandezza (così che l'altra macchina preparare un byte[] di quella grandezza).. aspetto l'altra conferma ed invio!!

    Codice PHP:
        public partial class Form1 Form
        
    {
            
            
    //Numero incaricati al trasporto

            
    Queue<Bitmap>[] queueFrames = new Queue<Bitmap>[3];
            
    Thread[] thread = new Thread[3];
            
    TcpClient[] client = new TcpClient[3];

            public 
    Form1()
            {
                
    InitializeComponent();
                
    inizializzaCode();
            }

            private 
    void inizializzaCode()
            {
                for (
    int i 03i++)
                    
    queueFrames[i] = new Queue<Bitmap>();
            }

            private 
    void button1_Click(object senderEventArgs e)
            {
                
    Webcam.getDevices();
                
    Webcam.startFrame(0);
                
    Webcam.videoSource.NewFrame += new AForge.Video.NewFrameEventHandler(videoSource_NewFrame);
                for (
    int i 03i++)
                {
                    
    thread[i] = new Thread(new ParameterizedThreadStart(sendFrame));
                    
    thread[i].Start(new object[] { queueFrames[i], client[i] });
                }
            }

            
    int indexcoda 0;
            
    void videoSource_NewFrame(object senderAForge.Video.NewFrameEventArgs eventArgs)
            {
               
    //inserisco sequenzialmente in ogni coda diversa i frame catturati
                
    if (indexcoda == 2)
                {
                    
    queueFrames[indexcoda].Enqueue((Bitmap)eventArgs.Frame.Clone());
                    
    indexcoda 0;
                }
                else
                {
                    
    queueFrames[indexcoda].Enqueue((Bitmap)eventArgs.Frame.Clone());
                    
    indexcoda += 1;
                }
            }

            
            private 
    void sendFrame(Object obj)
            {
                
    object[] objs = (object[])obj;
                
    Queue<Bitmapqueue = (Queue<Bitmap>)objs[0];
                
    TcpClient client = (TcpClient)objs[1];

                
    //Connessione e stream
                
    IPHostEntry addr Dns.GetHostEntry("indirizzomio");
                
    StringBuilder sb1 = new StringBuilder();
                
    client = new TcpClient(addr.AddressList[0].ToString(), 9999);
                
    NetworkStream stream client.GetStream();
                
    StreamWriter sWriter = new StreamWriter(stream);
                
    StreamReader sReader = new StreamReader(stream);
                
    /////////////////////

                //Gestione compressione JPEG
                
    ImageCodecInfo jgpEncoder GetEncoder(ImageFormat.Jpeg);
                
    System.Drawing.Imaging.Encoder myEncoder System.Drawing.Imaging.Encoder.Quality;
                
    EncoderParameters myEncoderParameters = new EncoderParameters(1);
                
    EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder50L);
                
    myEncoderParameters.Param[0] = myEncoderParameter;
                
    ////////////////////////////

                //Ciclo invio frames
                
    byte[] data;
                while (
    true)
                {
                    try
                    {
                        if (
    queue.Count 0)
                        {
                            
    sb1.Append(sReader.ReadLine());
                            if (
    sb1.ToString().Contains("sendframe"))
                            {
                                if (
    client.Connected)
                                {
                                    
    //connesso
                                    
    StringBuilder s2 = new StringBuilder();
                                    
    MemoryStream mStream = new MemoryStream();
                                    
                                        
    queue.Dequeue().Save(mStreamjgpEncodermyEncoderParameters);
                                        
    mStream.Position 0;
                                        
    data = new byte[mStream.Length];
                                        
    mStream.Read(data0Convert.ToInt32(mStream.Length));
                                        
    mStream.Close();
                                        
    s2.Append(data.Length);
                                        
    sWriter.WriteLine("sendsize");
                                        
    sWriter.Flush();
                                        
    sWriter.WriteLine(s2);
                                        
    sWriter.Flush();
                                        if (
    sReader.ReadLine().Contains("oksend"))
                                        {
                                            
    stream.Write(data0data.Length);
                                        }

                                        
    mStream.Close();
                                    
                                    
                                }
                                else
                                {
                                    
    //non connesso
                                    
    break;
                                }
                            }
                        }
                    }
                    catch (
    Exception ex)
                    {
                    }
                }
                
    ////////////////////
            
    }

            private 
    ImageCodecInfo GetEncoder(ImageFormat format)
            {

                
    ImageCodecInfo[] codecs ImageCodecInfo.GetImageDecoders();

                foreach (
    ImageCodecInfo codec in codecs)
                {
                    if (
    codec.FormatID == format.Guid)
                    {
                        return 
    codec;
                    }
                }
                return 
    null;
            }
        } 

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.