Wie liest man mit C ++ (C #) Soundstream, der per Flash gesendet wird?

8

Ich muss Soundstream lesen, der von Flash-Audio in meiner C ++ - Anwendung gesendet wird (C ++ ist keine echte Einschränkung, es kann C # oder eine andere Desktop-Sprache sein). Jetzt Flash-App sendet Audio an eine andere Flash-App, aber ich muss das gleiche Audio von Desktop-Anwendung erhalten. Also, gibt es einen Standard oder den besten Weg, wie es geht?

Danke für Ihre Antworten.

    
Oleg 28.02.2010, 11:29
quelle

5 Antworten

1

Wie wird der Ton tatsächlich gesendet? Über das Netzwerk?

Bearbeiten : Sie erfassen entweder die Audiodaten von einem HTTP-Stream oder einem RTMP-Stream. Führe Wireshark aus, um es herauszufinden, aber ich vermute, du machst etwas leicht schattiges ...

    
Adam Baxter 12.03.2010 05:57
quelle
0

Sie könnten versuchen, das Soundsystem des Gnash-Projekts zu verwenden.

    
Mike Burrows 01.03.2010 11:41
quelle
0

Sie möchten also grundsätzlich eine Verbindung zum RTMP-Soundstream vom Flash-Medienserver aus einer beliebigen Nicht-Flash-Anwendung herstellen? Haben Sie sich Ссылка angesehen?

    
Dženan 03.04.2010 16:03
quelle
0

Leider ist Adobe relativ proprietär (daher die Apple-Adobe-Kriege in letzter Zeit), aber für mehrere Sprachen gibt es Projekte, die mit RTMP aushelfen.

WebOrb ist kommerziell, für .NET, Java, PHP: Ссылка

FluorineFX ist nur Open Source für .NET: Ссылка

Ich habe mich selbst nicht für RTMP verwendet, aber ich habe FluorineFX verwendet, um eine Verbindung zu einem Flash-Remoting-Gateway (AMF) herzustellen. Ich stelle mir vor, es könnte tun, was Sie benötigen, um den Audio-Stream von einem .NET-fähigen Client zu empfangen.

    
Matt DeKrey 04.06.2010 13:59
quelle
0

Holen Sie sich die Bilder, die Bildrate und andere Attribute des Videoclips Wenn Sie Erfahrung mit dem Schreiben von Anwendungen in Microsoft DirectShow Editing Services (Codename Dexter) haben, wird dies Ihnen sehr vertraut vorkommen. In der Windows-Umgebung wurde das Erfassen von Standbildern traditionell mit C ++ und Dexter Type Library durchgeführt, um auf DirectShow-COM-Objekte zuzugreifen. Um dies in .NET Framework zu tun, können Sie eine Interop-Assembly von DexterLib erstellen, die unter COM-Referenzen in VS 2005 aufgeführt ist. Es dauert jedoch eine Menge Arbeit, um herauszufinden, wie Sie Ihren Code von C ++ in C # .NET konvertieren. Das Problem tritt auf, wenn Sie eine Zeigerreferenz als Argument für eine systemeigene Funktion übergeben müssen. CLR unterstützt Zeiger nicht direkt, da sich die Speicherposition nach jedem Speicherbereinigungszyklus ändern kann. Sie finden viele Artikel über die Verwendung von DirectShow auf dem CodeProject oder anderen Orten und wir versuchen, es einfach zu halten. Hier ist unser Ziel, eine Videodatei in ein Array von Bitmaps zu konvertieren und ich habe versucht, dies so kurz wie möglich zu halten. Natürlich können Sie Ihren eigenen Code schreiben, um die Bitmaps aus einem Livestream zu entfernen und sie kurz vor dem Senden zu puffern .

Grundsätzlich haben wir zwei Möglichkeiten, die DirectShow für die Konvertierung unserer Videodatei in Frames in .NET zu verwenden:

Bearbeiten Sie die Interop-Assembly, und ändern Sie die Typreferenzen vom Zeiger in C # .NET-Typen. Verwenden Sie Zeiger mit unsicherem Schlüsselwort. Wir haben uns für die unsichere (read fast) Methode entschieden. Das bedeutet, dass wir unsere Frames außerhalb des .NET-verwalteten Bereichs extrahieren. Es ist wichtig zu erwähnen, dass "verwaltet" nicht immer "besser" bedeutet und "unsicher" nicht wirklich unsicher bedeutet!

MediaDetClass mediaClass = neue MediaDetClass (); _AMMediaType mediaType; ... // lade die Videodatei int outputStreams = mediaClass.OutputStreams; outFrameRate = 0.0; für (int i = 0; i & lt; outputStreams; i ++) {   mediaClass.CurrentStream = i;   Versuchen{      // Wenn es die Framerate bekommen kann, ist es genug,      // Wir akzeptieren die Videodatei, ansonsten wird hier eine Ausnahme ausgelöst      outFrameRate = mediaClass.FrameRate;        .......      // Erhalte die Attribute hier         .....

%Vor%

} // Keine Bildrate? if (outFrameRate == 0.0)     Neue NotSupportedException auslösen ("Das Programm kann nicht ausgeführt werden" +                                      "um die Videodatei zu lesen."); // haben wir eine Framerate? mach weiter... ... // Erzeuge ein Array, um Bitmaps zu halten und zu infiltrieren // andere Objekte zum Speichern von Informationen ...

unsicher {     ...     // Erzeuge einen Bytezeiger, um die BitmapBits zu speichern     ...    while (currentStreamPos & lt; endPosition)    {       mediaClass.GetBitmapBits (currentStreamPos, ref pufferSize,                                ref * ptrRefFramesBuffer,                                outClipSize.Width, outClipSize.Height);    ...
   // füge frameArray eine Rahmen-Bitmap hinzu     ...   } } ...

Übertragen Sie extrahierte Daten über HTTP Bisher haben wir unser Video in ein Array von Bitmap-Frames umgewandelt. Der nächste Schritt besteht darin, unsere Frames über HTTP an den Browser des Clients zu übertragen. Es wäre schön, wenn wir nur unsere Bitmap-Bits an den Client senden könnten, aber wir können es nicht. HTTP dient zum Übertragen von Textzeichen, dh Ihr Browser liest nur Zeichen, die im Zeichensatz der HTML-Seite definiert sind. Alles andere außerhalb dieser Kodierung kann nicht direkt angezeigt werden.

Um diesen Schritt auszuführen, verwenden wir die Base64-Codierung, um unsere Bitmap in ASCII-Zeichen umzuwandeln. Traditionell wurde die Base64-Codierung zum Einbetten von Objekten in E-Mails verwendet. Fast alle modernen Browser einschließlich Gecko-Browser, Opera, Safari und KDE (nicht IE!) Unterstützen Daten: URI-Schema-Standard zum Anzeigen von Base64-kodierten Bildern. Groß! Jetzt haben wir unsere Frames bereit für die Übertragung über HTTP.

System.IO.MemoryStream memory = neues System.IO.MemoryStream (); while (currentStreamPos & lt; endPosition) {   ...   // Speichere die Bitmpas irgendwo im (verwalteten) Speicher   vdeoBitmaps.Save (Speicher, System.Drawing.Imaging.ImageFormat.Jpeg);   // Konvertiere es in Base64   strFrameArray [frameCount] = System.Convert.ToBase64String (Speicher.ToArray ());  // Mach dich bereit für den nächsten   memory.Seek (0, System.IO.SeekOrigin.Begin);  } memory.Close (); ...

Aber wir können nicht einfach die codierten Frames als eine riesige Zeichenfolge aussenden. Wir erstellen ein XML-Dokument, das unsere Frames und andere Informationen über das Video enthält und es dann an den Client sendet. Auf diese Weise kann der Browser unsere Frames als DOM-XML-Objekt empfangen und leicht durch sie navigieren. Stellen Sie sich vor, wie einfach es ist, ein Video zu bearbeiten, das im XML-Format gespeichert ist:

        14.9850224700412         {Breite = 160, Höhe = 120}         6.4731334      / 9j / 4AAQSkZJRgABAQEAYAB ....      ....   

Dieses Format hat auch seine eigenen Nachteile. Die Videos, die in Base64-kodierte XML-Dateien konvertiert werden, liegen zwischen 10% (meistens AVI-Dateien) und 300% oder mehr (einige WMV-Dateien), die größer sind als ihre Binäräquivalente.

Wenn Sie eine XML-Datei verwenden, brauchen Sie sogar keinen Webserver, Sie können den HTML-Code aus einem lokalen Verzeichnis öffnen und es sollte funktionieren! Ich habe eine ausführbare Datei in die Download-Datei des Artikels eingefügt, die Ihre Videodatei in ein XML-Dokument umwandeln kann, das später im Browser angezeigt werden kann. Es ist jedoch keine gute Idee, große Dateien und hochauflösende Videos zu verwenden!

OK, jetzt können wir unser Base64-codiertes Video -XML-Dokument genauso versenden wie mit jeder anderen Art von XML-Dateien. Wer sagt, dass XML-Dateien ohnehin immer langweilige Datensätze sein müssen

    
John 09.06.2010 07:11
quelle

Tags und Links