2017-04-24 5 views
2

Ich arbeite mit einem Echtzeit-Video-Recorder, aber wenn ich Videos aufnehme, ist die Größe des Videos wirklich riesig! Es ist wie 50MBps. Im mit Bibliotheken DirectX und DirectShowLibBessere Komprimierung mit DirextX.Filters.VideoCompressor

ich verwendet, um die folgenden VideoCompressor

capture.VideoCompressor = Filters.VideoCompressors(0) 

Nicht das Video wie 5Mbps ist, aber immer noch das ist sehr riesig!

Der Name des Compressors für diesen Index lautet DV Video Encoder. Und hier die Liste des Video-Encoder sind von 0

DV Video Encoder 
ffdshow video encoder 
MJPEG Compressor 
MSScreen 9 encoder DMO 
UtVideo Pro YUV422 10bit DMO 
UtVideo RGB DMO 
UtVideo RGBA DMO 
UtVideo YUV420 BT.601 DMO 
UtVideo YUV420 BT.709 DMO 
UtVideo YUV422 BT.601 DMO 
UtVideo YUV422 BT.709 DMO 
WMVideo8 Encoder DMO 
WMVideo9 Encoder DMO 

Aber leider DV-Video-Encoder mit dem Index von 0 funktioniert nur mit dem obigen Code, oder aber, wenn ich zu Filers.VideoCompressors ändern beginnen (1), der ffdshow Video-Encoder, gibt es mir einen Fehler

Error HRESULT E_FAIL has been returned from a call to a COMP component. 

Jede Chance, es effektiv zu komprimieren? Oder sollte ich ffmpeg verwenden? Wenn ja, wie könnte ich ffmpeg komprimieren, während das Video läuft?

Danke.

Antwort

0

Als erstes möchte ich erwähnen, dass der ffdshow Video Encoder im Wesentlichen ein ffmpeg ist, der für die direkte Show übernommen wurde. Es erfordert jedoch zusätzliche Konfiguration (wie Auswahl eines der verfügbaren Codecs und Konfiguration) und ich bin nicht sicher, ob es möglich (oder sinnvoll) ist, es über die vb.net-API zu verwenden (was ziemlich begrenzt ist, wenn ich mich richtig erinnere). UtVideo YUV422 BT.601 und UtVideo YUV422 BT.709 wären eine gute Wahl für SD- und HD-Videokodierung. Sie sind ziemlich schnell und produzieren verlustfreies Video mit angemessener Komprimierung, die später mit langsamen, aber hochkomprimierten Codecs wie h264 oder h265 komprimiert werden kann. Sie können wahrscheinlich ffmpeg sowie does support direct show sources as inputs verwenden.

0

In den meisten Fällen möchten Sie bestimmte Videocodierungen verwenden, wie insbesondere H.264 oder Windows Media Video, da dies weitere Integrationsoptionen (bestimmtes Dateiformat oder Streaming-Integration usw.) vorschreibt. Dann verwenden Sie einen bestimmten Codec, von dem Sie wissen, dass er für Ihren Zweck geeignet ist (schnell genug oder mit spezifischen Kodierungsoptionen, die zwingend erforderlich sind usw.). Das heißt, Filters.VideoCompressors Sammlung ist nicht gerade eine reiche Sammlung Ihrer Wahl, sondern ein Accessor, um einen Codec auszuwählen, den Sie bereits kennen und suchen.

Leider ist DirectShow Codec Angebot nicht gut. Es gibt Gründe dafür, einschließlich, dass DirectShow selbst älter als die meisten gängigen Codecs ist, und dann Lizenzprobleme verhindert von Anfang an die guten Codecs verfügbar machen. Später war DirectShow bereits im Rentenalter und der H.264-Encoder wurde nur über die neuere API angeboten.

Also hier Ihre Schritte sind die folgenden (vorausgesetzt, Sie bleiben mit DirectShowLib):

  1. verstehen, was Video-Codierung Sie
  2. verwenden wollen Wenn Sie mit Lager-Encoder, Ihre wahrscheinlich Option bleiben wollen ist WMVideo9 Encoder DMO und Windows Media Video allgemein
  3. Sonst sollen Sie Codec Ihres Interesses identifizieren, ein H.264-Codec als wahrscheinliche Option, verstehen, was es sie verfügbar via Directshow
  4. Verwenden Sie die Sammlung zu machen braucht den Codec von Ihrem Interesse zu finden, je oben geschrieben, instanziiert den Codec von dort, und dies in Ihrer Directshow-Pipeline