Moyen plus rapide d’écrire une image dans Process.StandardInput.BaseStream

J’essaie d’envoyer un grand nombre d’images capturées sur le bureau à un encodeur (FFmpeg) stdin.

L’exemple de code suivant fonctionne.

la fonction CaptureScreen() fournit une image en 5-10 ms.

Si j’enregistre l’image dans un MemoryStream, cela ne prend presque pas de temps.

Mais je ne peux enregistrer qu’une image toutes les 45 ms dans proc.StandardInput.BaseStream.

 public void Start(ssortingng bitrate, ssortingng buffer, ssortingng fps, ssortingng rtmp, ssortingng resolution, ssortingng preset) { proc.StartInfo.FileName = myPath + "\\ffmpeg.exe"; proc.StartInfo.Arguments = "-f image2pipe -i pipe:.bmp -vcodec libx264 -preset " + preset + " -maxrate " + bitrate + "k -bufsize " + buffer + "k -bt 10 -r " + fps + " -an -y test.avi"; //+ rtmp; proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardInput = true; proc.StartInfo.RedirectStandardOutput = true; proc.Start(); Stopwatch st = new Stopwatch(); BinaryWriter writer = new BinaryWriter(proc.StandardInput.BaseStream); System.Drawing.Image img; st.Reset(); st.Start(); for (int z = 0; z < 100; z++) { img = ScrCap.CaptureScreen(); img.Save(writer.BaseStream, System.Drawing.Imaging.ImageFormat.Bmp); img.Dispose(); } st.Stop(); System.Windows.Forms.MessageBox.Show(st.ElapsedMilliseconds.ToString()); } 

La question est:

Puis-je faire le processus de sauvegarde plus rapidement?

J’essaie d’obtenir une stabilité de 60 images par seconde de cette façon

Le goulot d’étranglement ici est que ffmpeg lit les données à la même vitesse qu’elle les compresse en .avi, ce qui est lent. Donc, votre méthode img.Save bloque jusqu’à ce qu’il y ait un peu d’espace dans la mémoire tampon du stream pour écrire ses données.

Vous ne pouvez pas faire grand chose. La compression de vidéos HD à 60 ips en temps réel nécessite une énorme puissance de traitement.