2016-04-10 5 views
3

Es gibt eine Menge Fragen zu opencv + H.264, aber keine von ihnen gab detaillierte Erklärung.

ich benutze openh264 (openh264-1.4.0-win32msvc.dll) zusammen mit opencv 3.1 (benutzerdefinierte Build mit Cmake mit ffmpeg aktiviert) in Visual Studio, ich wollte Video von der Webcam im mp4-Format mit H.264 speichern Kompressionopenh264 - bEnableFrameSkip = 0, Bitrate kann nicht gesteuert werden

VideoWriter write = VideoWriter ("D: /movie.mp4", CV_FOURCC ('H', '2', '6', '4'), 10,0, cv :: Größe (192, 144), wahr);

, bevor ich sah eine Warnmeldung openh264, in Konsolenfenster mit „Failed-Bibliothek laden openh264: openh264-1.4.0-win32msvc.dll bitte Ihre Umgebung überprüfen und/oder hier herunterladen: https://github.com/cisco/openh264/releases „ (wurde auch Video wurde nicht gespeichert)

so heruntergeladen ich die dll & in einem Ordner mit meiner Programmdatei gehalten (exe) jetzt, wenn ich das Programm ausführen, ich sehe verschiedene Fehler “ [OpenH264] this = 0x0DE312C0, Warnung: bEnabledFrameSkip = 0, für die Bitrate kann nicht gesteuert werden RC_QUALITY_MODE und RC_TIMESTAMP_MODE ohne das Aktivieren des Übersprungrahmens " (jetzt wird das Video gespeichert, aber die Größe ist sehr hoch! Bitrate ist um 1200 Kbps)

für mich ist der einzige Zweck des Verwendens von h264, die Dateigröße zu verringern. ich denke, dass ich Openh264 mit einigen änderungen selbst bauen muss, um diesen Fehler zu entfernen, kann mir jemand wie ? oder sagen Sie mir, ob es eine Möglichkeit gibt, die Bitrate irgendwie durch Code zu reduzieren?

PS: Ich habe versucht, -1 anstelle von CV_FOURCC(), "installierte Codecs" Fenster in meinem System angezeigt, ich konnte h264 oder x264 oder h264vfw nicht finden, obwohl ich verschiedene Codec Packs & h264 installiert habe here

Dank & Grüße

Antwort

2

Wenn Sie Bitrate steuern möchten, Sie haben beide ich alle Parameter Openh264 Encoding als Beispiel zeige,

encoderParemeters.iRCMode = RC_OFF_MODE; 
encoderParemeters.bEnableFrameSkip = true; 


Hier verwenden:

long nReturnedValueFromEncoder = WelsCreateSVCEncoder(&m_pSVCVideoEncoder); 


    m_nVideoWidth = 352; 
    m_nVideoHeight = 288; 

    SEncParamExt encoderParemeters; 

    memset(&encoderParemeters, 0, sizeof(SEncParamExt)); 

    m_pSVCVideoEncoder->GetDefaultParams(&encoderParemeters); 

    encoderParemeters.iUsageType = CAMERA_VIDEO_REAL_TIME; 
    encoderParemeters.iTemporalLayerNum = 0; 
    encoderParemeters.uiIntraPeriod = 15; 
    encoderParemeters.eSpsPpsIdStrategy = INCREASING_ID; 
    encoderParemeters.bEnableSSEI = false; 
    encoderParemeters.bEnableFrameCroppingFlag = true; 
    encoderParemeters.iLoopFilterDisableIdc = 0; 
    encoderParemeters.iLoopFilterAlphaC0Offset = 0; 
    encoderParemeters.iLoopFilterBetaOffset = 0; 
    encoderParemeters.iMultipleThreadIdc = 0; 

    encoderParemeters.iRCMode = RC_BITRATE_MODE; 
    encoderParemeters.iMinQp = 0; 
    encoderParemeters.iMaxQp = 52; 



    encoderParemeters.bEnableDenoise = false; 
    encoderParemeters.bEnableSceneChangeDetect = false; 
    encoderParemeters.bEnableBackgroundDetection = true; 
    encoderParemeters.bEnableAdaptiveQuant = false; 
    encoderParemeters.bEnableFrameSkip = true; 
    encoderParemeters.bEnableLongTermReference = true; 
    encoderParemeters.iLtrMarkPeriod = 20; 
    encoderParemeters.bPrefixNalAddingCtrl = false; 
    encoderParemeters.iSpatialLayerNum = 1; 


    SSpatialLayerConfig *spartialLayerConfiguration = &encoderParemeters.sSpatialLayers[0]; 

    spartialLayerConfiguration->uiProfileIdc = PRO_BASELINE;//; 

    encoderParemeters.iPicWidth = spartialLayerConfiguration->iVideoWidth = m_nVideoWidth; 
    encoderParemeters.iPicHeight = spartialLayerConfiguration->iVideoHeight = m_nVideoHeight; 
    encoderParemeters.fMaxFrameRate = spartialLayerConfiguration->fFrameRate = (float)30; 

    encoderParemeters.iTargetBitrate = spartialLayerConfiguration->iSpatialBitrate = 500000; 
    encoderParemeters.iTargetBitrate = spartialLayerConfiguration->iMaxSpatialBitrate = 500000; 


    spartialLayerConfiguration->iDLayerQp = 24; 
    //spartialLayerConfiguration->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE; 
    spartialLayerConfiguration->sSliceArgument.uiSliceMode = SM_SINGLE_SLICE; 


    nReturnedValueFromEncoder = m_pSVCVideoEncoder->InitializeExt(&encoderParemeters); 

Hoffe, es wird Ihnen helfen.

+2

Danke für detaillierte Antwort, ich denke für diesen Code, ich muss Openh264 Bibliotheken & Include-Dateien in Visual Studio hinzufügen. Wie erreiche ich das? Muss ich Open264-Bibliotheken selbst erstellen oder kann ich vorkompilierte Bibliotheken für Windows bekommen? Ich suche, aber nicht viel. versucht [dies] (http: // stackoverflow.com/questions/30045356/unable-to-build-openh264-lib-for-windows) aber es hat nicht funktioniert (Build in Visual Studio fehlgeschlagen) hast du hilfreiche Links? Danke –

+3

Sie müssen Openh264 mit Visual Studio bauen: i) Laden Sie OpenH264 Quellcode von Cisco ii) Sie finden Visual Studio kompatibles Projekt/OpenH264/codec/build/win32/dec und/OpenH264/codec/build/win32/enc Verzeichnis. iii) Sie müssen NASM-Software herunterladen iv) Dann NASM ausführbaren Pfad zu allen diesen Visual Studio-Projekte v) Dann können Sie entweder statische oder dynamische Bibliothek in allgemeinen Optionen auswählen. vi) Schließlich haben Sie 5 verschiedene .lib- oder .dll-Projektdateien, die in jedem Visual Studio-Projekt verwendet werden können. – RajibTheKing

+0

** Wie erstelle ich einen Video-Dateinamen ** das ist 'video_file.mp4' in' encoderParemeters'? Wenn nicht in 'encoderParemeters', wo sonst kann ich dem Encoder sagen, dass dies meine Videodatei ist, in die Daten zu kodieren sind. @RajibTheKing Können Sie sich bitte meine Frage [hier] (https://stackoverflow.com/questions/46760839/paramvalidationext-error-with-welsinitencoderext-failed-while-setting-up-openh26) ansehen. Sehr ähnlich, was die Einrichtung des Encoders in OpenH264 betrifft. Danke im Voraus –

1

Sie einfach Bitrate RC_BITRATE_MODE und ermöglicht bEnableFrameSkip in Openh264 mit gesteuert werden.

+0

Danke für Ihre Antwort. Ich habe Openh264 noch nicht benutzt. Wie ich schon gesagt habe, ich hatte gerade eine DLL-Datei in ein ausführbares Verzeichnis kopiert. Also, um bEnableSkip-Frame zu aktivieren, muss ich Open264-Header-Dateien und statische Bibliotheken in das Visual Studio-Projekt aufnehmen. irgendwelche nützlichen Verbindungen dafür? versucht [dies] (http://stackoverflow.com/questions/30045356/unable-to-build-openh264-lib-for-windows) aber hat nicht funktioniert (Build in Visual Studio fehlgeschlagen) Danke –

Verwandte Themen