2016-07-01 7 views
1

Ich bin völlig unbekannt mit Skripten in Windows, sind aber gezwungen, ein solches Skript zu verwenden. Ich möchte jemanden, der mir mit dem folgenden Problem hilft. Ich möchte die Ausgabe von ffmpeg Befehl verarbeiten, um Informationen über den Zugriff auf eine Webcam zu speichern, die später verwendet werden soll. Genauer Befehl folgt:ffmpeg Ausgabe analysieren im Batch-Skript

ffmpeg -stats -hide_banner -list_devices true -f dshow -i dummy 

und Ausgang ist wie folgt:

[dshow @ 02cec400] DirectShow video devices (some may be both video and audio devices) 
[dshow @ 02cec400] "Microsoft LifeCam Studio" 
[dshow @ 02cec400]  Alternative name "@device_pnp_\\?\usb#vid_045e&pid_0772&mi_00#6&2a15e69b&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global" 
[dshow @ 02cec400] DirectShow audio devices 
[dshow @ 02cec400] "Desktop Microphone (3- Studio -" 
[dshow @ 02cec400]  Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\Desktop Microphone (3- Studio -" 
[dshow @ 02cec400] "Line In (High Definition Audio " 
[dshow @ 02cec400]  Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\Line In (High Definition Audio " 
[dshow @ 02cec400] "Microphone (High Definition Aud" 
[dshow @ 02cec400]  Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\Microphone (High Definition Aud" 

Typischerweise wird die ersten beiden Vorkommen für „Alternative Name“ von Directshow entsprechen Video und Audio, so der Einfachheit halber I möchte diese zwei Informationen in zwei Variablen gespeichert. In diesem Beispiel ist:

@device_pnp_\\?\usb#vid_045e&pid_0772&mi_00#6&2a15e69b&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global 

und

@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\Desktop Microphone (3- Studio - 

Kann jemand erfahreneren mich mit dieser Aufgabe zu helfen? Vielen Dank im Voraus!

Antwort

1

Sie können diese (untestet!) Versuchen

 
@echo off&setlocal disabledelayedexpansion 
set "Alt1=" 
set "Alt2=" 
For /f tokens^=1^,2delims^=^" %%a in ('ffmpeg -stats -hide_banner -list_devices true -f dshow -i dummy 2^>^&1 ^| findstr /c:"Alternative name"') do (
    if not defined Alt1 (
     set "Alt1=%%~b" 
    ) else (
     if not defined Alt2 (
     set "Alt2=%%~b" 
    ) 
    ) 
) 
echo Alternative name 1: "%Alt1%" 
echo Alternative name 2: "%Alt2%" 
+0

Arbeite wie ein Zauber !! Danke vielmals! Haben Sie einen Vorschlag, wie Sie im Batch-Skript mit einem eingetragenen Markenzeichen umgehen. Microsoft Webcams haben diesen Anmeldenamen und geben mir ein seltsames Symbol. Ich denke, etwas ist mit der Schriftart verwandt, die von der Konsole verwendet wird. – vlad2005

+0

@ vlad2005 Dies ist ein sehr schwieriges Problem, es hängt von Ihren lokalen Einstellungen ab, lesen Sie bitte [hier] (http://stackoverflow.com/a/17177904/2098699). Bitte markieren Sie meine Antwort als akzeptiert, wenn ja. Vielen Dank. – Endoro

1

Dieser Batch Code weist erste Gerät String Variable DeviceVideo und das zweite Gerät String Variable DeviceAudio.

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 
set "DeviceCount=0" 

for /F "tokens=4,5*" %%A in ('ffmpeg.exe -stats -hide_banner -list_devices true -f dshow -i dummy 2^>^&1') do (
    if "%%A %%B" == "Alternative name" (
     set /A DeviceCount+=1 
     if "!DeviceCount!" == "1" (
      set "DeviceVideo=%%~C" 
     ) else (
      set "DeviceAudio=%%~C" 
      goto DevicesOutput 
     ) 
    ) 
) 

:DevicesOutput 
set Device 
endlocal 

ffmpeg Ausgänge Textnachrichten STDERR statt STDOUT die definitiv typisch nicht für Konsolenanwendungen zu handhaben. Befehl FOR erfasst und verarbeitet nur Text gedruckt auf STDOUT.

Aus diesem Grunde ist es notwendig, alle Ausgabe von ffmpeg zu umleiten STDERR zu handhaben STDOUT zu handhaben mit 2>&1 als Microsoft Using command redirection operators in TechNet-Artikel erklärt. Es ist notwendig, mit ^ die Operatoren > und & zu entkommen, da diese Umleitung bei Ausführung von ffmpeg und nicht bei Ausführung von FOR angewendet werden soll.

Befehl FüR Prozesse neben den Ausgangsleitungen von ffmpeg mit Leerzeilen übersprungen und auch mit einem Semikolon Startlinie (default eol).

Jede Zeile ist in Zeichenfolgen aufgeteilt, wobei Leerzeichen/Tabulatoren als Trennzeichen verwendet werden (Standard delims). Es wird mit tokens=4,5* spezifiziert, dass nur die Strings 4, 5 und der Rest der Zeile nach fünftem Leerzeichen/Tabs separater String von Interesse sind und den Loop-Variablen A, B und C zugeordnet werden sollen.

Zum Beispiel die Linie

[dshow @ 02cec400]  Alternative name "@device_pnp_\\?\usb#vid_045e&pid_0772&mi_00#6&2a15e69b&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global" 

wird auf die Saiten aufgespalten

  1. [dshow ... ignoriert als Token-1 nicht angegeben ist.
  2. @ ... ignoriert, da Token 2 nicht angegeben ist.
  3. 02cec400] ... ignoriert, da Token 3 nicht angegeben ist.
  4. Alternative ... Token 4 zugewiesen Loop-Variable A.
  5. name ... Token 5 zugewiesen Loop-Variable B.
  6. "@device_pnp_\\?\usb#vid_045e&pid_0772&mi_00#6&2a15e69b&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global" ... Token 6 mit * angegebenen übereinstimmenden Rest der Zeile (mit Leerzeichen und Tabs) zugewiesen Loop-Variable C.

Innerhalb der Schleife ein Fall empfindlichen String-Vergleich vorgenommen, um zu prüfen, ob Schleifenvariable A und B, mit einem einzigen Raum zwischen, in doppelten Anführungszeichen ist der String "Alternative name" gleich. Die doppelten Anführungszeichen werden nicht durch IF vor dem Vergleich der beiden Zeichenfolgen entfernt.

Bei gleichen Strings wird eine Umgebungsvariable mit einem einfachen arithmetischen Ausdruck um eins erhöht, da in der Ausgabe ein neuer Gerätename gefunden wird.

Der Befehlsinterpreter von Windows ersetzt alle Umgebungsvariable Referenzen mit Syntax %VariableName% durch den aktuellen Wert jedes referenzierte Umgebungsvariable in einem Befehlsblock mit ( definiert ... ) bereits auf einen solchen Block zu finden. Wenn %DeviceCount% im Befehlsblock verwendet würde, würde jeder Schleifenlauf mit dem Wert 0 ausgeführt werden, wie in der Zeile über der FOR Schleife definiert. Daher wird die verzögerte Erweiterung verwendet, indem die Syntax !DeviceCount! verwendet wird und die verzögerte Erweiterung explizit am Anfang des Stapel-Skripts aktiviert wird, da die verzögerte Erweiterung standardmäßig nicht aktiviert ist.

Hinweis: Der Befehl setlocal drückt auch die aktuellen Zustände der Befehlserweiterungen und verzögerte Erweiterungen sowie aktuelles Verzeichnis und ein Zeiger auf Tabelle aktueller Umgebungsvariablen auf dem Stack und erstellt eine Kopie der Tabelle gesamte Umgebungsvariablen für Verwendung bis (übereinstimmend) endlocal oder zum Beenden der Batch-Dateiverarbeitung.

Das Gerät Zeichenfolge ohne die umliegenden doppelten Anführungszeichen wegen %%~C statt nur ist %%C entweder oder variable DeviceAudio Variable DeviceVideo zugewiesen, je nach Wert der Umgebungsvariablen DeviceCount.

Da nur die ersten 2 Geräte-Strings von Interesse sind, wird die Schleife bereits nach dem Zuweisen der zweiten Gerätezeichenfolge zu DeviceAudio beendet.

Alle Variablen mit der Unter Start Device ausgegeben werden alphabetisch nächste verarbeitete Zeile sortiert auf, die in der Ausgabe für das Beispiel ergibt:

[email protected]_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\Desktop Microphone (3- Studio - 
DeviceCount=2 
[email protected]_pnp_\\?\usb#vid_045e&pid_0772&mi_00#6&2a15e69b&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global 

schließlich mit dem Befehl endlocal die aktuelle Umgebungsvariablen Tabelle mit DeviceAudio, DeviceCount und DeviceVideo wird aus dem Speicher entfernt, Zustände von Befehlserweiterungen (aktiviert als standardmäßig aktiviert) und verzögerte Erweiterung (deaktiviert als standardmäßig deaktiviert), und das aktuelle Verzeichnis (überhaupt nicht geändert) wird wiederhergestellt, und die anfängliche Umgebungsvariablentabelle wird erstellt wieder aktiv .

Um die verwendeten Befehle noch besser zu verstehen, öffnen Sie ein Eingabeaufforderungsfenster, führen Sie dort die folgenden Befehle aus und lesen Sie alle Hilfeseiten, die für jeden Befehl angezeigt werden, sorgfältig durch.

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?