2009-05-01 10 views
1

Ist es einfach zu schreiben einige .Net-Code zum Aufzeichnen von Bildschirm und Audio (von Computer-Mikrofon), dann Ausgabe in eine WMV-Datei. Irgendein Referenzcode?mit Windows Media Encoder zum Aufzeichnen Bildschirm

BTW: Ich suchte alle Codes von WME SDK, keinen solchen Beispielcode.

danke! George

+0

http://www.codeproject.com/KB/dialog/screencap.aspx?display=Print erwähnt es sowieso ... – rogerdpack

Antwort

2

Microsoft und die Inhalte Mafi^H^H^H^Hindus versuchen ihr Bestes, um dies unmöglich zu machen. Sie werden bei der Suche nach "Open-Source-Screen-Audio-Capture" viel besser sein als beim Durchsuchen von offiziell bereitgestellten Dokumentationen/Beispielcodes - ich wäre sehr überrascht, wenn Microsoft etwas Relevantes liefern würde.

+0

@hlovdal, 1. Ich habe gegoogelt für "Open-Source-Bildschirm Audio-Capture" Ich finde einige, aber nicht Bildschirm auf Video, sondern auf Bilder. 2. Ich lese SDK-Dokument WME, es erwähnt Aufnahmebildschirm + Audio ist eine Funktion, aber kein Beispielcode konnte referenziert werden. Ich glaube, es sollte einige geben. Irgendwelche Ideen? :-( – George2

+0

Nein, ich kenne keine Details. – hlovdal

1

Schauen Sie sich die SDK that's available for Techsmith Camtasia:

Camtasia ist ein Vollbild-Desktop-Recording-App mit Unterstützung für verschiedene Video- und Audioquellen, Codecs, etc. und deren SDK macht dies als ActiveX-Steuerelement (die Sie anrufen können von .NET ganz glücklich).

+0

@Dylan, Ich kann keine SDK-Dokumente oder Download-Link von Camtasia-Website finden. Könnten Sie herausfinden? – George2

+0

Ich entschuldige mich - es scheint, ihre SDK wurde eingestellt (http://www.techsmith.com/sdk.asp) Entschuldigung –

1

Es gibt DirectShow-kompatible Filter für die Bildschirmaufnahme. Damit können Sie jedes Aufnahmeprogramm verwenden, um den Bildschirminhalt zu erfassen oder eine Anwendung selbst in .NET zu schreiben (aber es ist nicht einfach).

Der, den ich verwenden ist: http://www.hmelyoff.com/index.php?section=9

EDIT: Ich habe nicht über eine Probe oder Erfahrungen mit dem WME SDK. Aber ich würde empfehlen, die DirectShow-Route zu gehen, um die Anforderung von WME auf dem Host-System zu vermeiden, die fehlende Unterstützung dafür, und es ist einfach gut, DirectShow (oder do-it-yourself) zu kennen, anstatt irgendeine zufällige API.

Um den Hmelyoff-Filter zu verwenden, funktioniert es wie eine Webcam. Es ist nur eine weitere Videoaufnahmequelle, die für jede Anwendung verfügbar ist, die Videoeingaben möchte. Es funktioniert, indem Sie einfach den Teil des viedo-Puffers auf seinen Ausgangs-Pin auf jedem Frame kopieren (mit einer API-Funktion wie BitBlt).

Ein Beispielcode ist here.

Oder wenn Sie nur mit DirectShow verbinden möchten, ist der einfachste Weg, eine Bibliothek zu verwenden, um die COM-Interaktion für Sie zu tun. http://directshownet.sourceforge.net/ ist ein guter.

Nochmals bearbeiten: Das Aufnehmen als Video ist das gleiche wie das Erfassen von Frames. Es erfasst nur Frames 30 Mal pro Sekunde. CPU Schwein? Es ist nicht zu erwarten, die volle Bildrate zu erhalten.

Wenn Sie fragen, wie Sie die Bilder als Video speichern können, müssen Sie die Daten an einen Videokodierer übergeben. Sie müssen dazu eine Schnittstelle zu DirectShow herstellen.

+0

@Nick, ich werde etwas Zeit nehmen, um hmelyoff zu studieren, und ich möchte auch Microsoft integrierte Lösung zur gleichen Zeit studieren :-) Eigentlich lese ich WME SDK-Dokument und es erwähnt, dass es Bildschirm-Feature durch .Net-Code unterstützt. Ich kann jedoch keine Beispielcodes finden. Haben Sie einen Bezugscode? – George2

+0

Eine andere Frage, ich brauche 15 Minuten, um hmelyoff zu studieren, aber ich habe keine Startdokumente gefunden, die die Konzepte/Architektur von hmelyoff und eine Schnellstartprobe beschreiben. Alles, was ich finde, ist eine Liste von Beispielcode und API, sie sind nicht ganz gut für einen Anfänger. Haben Sie solche Dokumente, um mich zum Lesen zu bewegen? :-) – George2

+0

@Nick, danke für deine Kommentare. Meine Anforderung ist nicht erfassen Bildschirm als statisches Bild, sondern erfassen als Video (Ich möchte Bewegung aller Fenster/Maus erfassen, um einige Demo, wie man einige Software zu verwenden). Ich habe das CodeGuru-Dokument gelesen und es scheint, dass ich mich mit dem Aufnahmebildschirm als statisches Bild befasse, nicht als Video aufnehmen? – George2

0

Am besten importieren Sie die Windows Media Encoder-Bibliotheken als COM-Schnittstelle in Ihre .net-Anwendung und verwenden Sie sie in Ihrer Anwendung.

0

Ja, das ist völlig machbar mit WME: http://www.c-sharpcorner.com/UploadFile/armoghanasif/CaptureDesktopActivities11122005013755AM/CaptureDesktopActivities.aspx

ich es in der Vergangenheit getan haben, und Sie können sehr gute Qualität Videos bekommen, wenn Sie die Encoding-Einstellungen starten zwicken. Vor allem, wenn WMV eine praktikable Option für Sie ist. Wenn nicht, müssten Sie ein anderes Format mit einer anderen Anwendung neu codieren.

Die einfachste Methode, die ich gefunden habe, war, die WME-Desktopanwendung zu verwenden, um verschiedene Einstellungen zu testen und aufzuzeichnen und diese Konfigurationsdateien zu speichern, die ich programmgesteuert von meiner Anwendung geladen habe.

0

Sie können Microsoft Expression Encoder 4 zum Aufzeichnen von Video und Audio verwenden. Es funktionierte nur für mich mit C#. Der folgende Code sollte vertraut sein.

void Encode(string jobPath) 
    { 
     using (Job j = new Job()) 
     { 

      MediaItem mediaItem = new MediaItem(jobPath); 
      var size = mediaItem.OriginalVideoSize; 
      WindowsMediaOutputFormat WMV_Format = new WindowsMediaOutputFormat(); 
      WMV_Format.VideoProfile = new Microsoft.Expression.Encoder.Profiles.AdvancedVC1VideoProfile(); 
      WMV_Format.AudioProfile = new Microsoft.Expression.Encoder.Profiles.WmaAudioProfile(); 
      WMV_Format.VideoProfile.AspectRatio = new System.Windows.Size(16, 9); 
      WMV_Format.VideoProfile.AutoFit = true; 

      if (size.Width >= 1920 && size.Height >= 1080) 
      { 
       WMV_Format.VideoProfile.Size = new System.Drawing.Size(1920, 1080); 
       WMV_Format.VideoProfile.Bitrate = new Microsoft.Expression.Encoder.Profiles.VariableUnconstrainedBitrate(6000); 
      } 
      else if (size.Width >= 1280 && size.Height >= 720) 
      { 
       WMV_Format.VideoProfile.Size = new System.Drawing.Size(1280, 720); 
       WMV_Format.VideoProfile.Bitrate = new Microsoft.Expression.Encoder.Profiles.VariableUnconstrainedBitrate(4000); 
      } 
      else 
      { 
       WMV_Format.VideoProfile.Size = new System.Drawing.Size(size.Width, size.Height); 
       WMV_Format.VideoProfile.Bitrate = new Microsoft.Expression.Encoder.Profiles.VariableUnconstrainedBitrate(2000); 
      } 
      mediaItem.VideoResizeMode = VideoResizeMode.Letterbox; 
      mediaItem.OutputFormat = WMV_Format; 
      j.MediaItems.Add(mediaItem); 
      j.CreateSubfolder = false; 
      j.OutputDirectory = @"D:\output"; 
      j.EncodeProgress += new EventHandler<EncodeProgressEventArgs>(j_EncodeProgress); 
      j.Encode(); 
     } 
    } 
+0

Wäre es nicht wert, Code in Ihre Antwort zu integrieren, die das OP zeigt, wie Sie das erreicht haben? – Bugs

Verwandte Themen