2016-04-10 30 views
3

opencv + H.264 ama ile ilgili çok fazla soru sorulmadı, bunların hiçbiri ayrıntılı bir açıklama getirmedi.

OpenH264 (openh264-1.4.0-win32msvc.dll) ile birlikte görsel stüdyosunda opencv 3.1 (ffmpeg etkinleştirilmiş cmake ile özel yapı) birlikte kullanıyorum, H.264 ile mp4 formatında web kamerasından gelen videoyu kaydetmek istedim = VideoWriter sıkıştırmaopenh264 - bEnableFrameSkip = 0, bitrate kontrol edilemedi

VideoWriter yazma ("D: /movie.mp4", CV_FOURCC (H ', '2', '6', '4'), 10.0, ev :: boyutu (192, 144), doğru); openh264-1.4.0-win32msvc.dll ortamınızı denetlemek ve/veya buradan indirin:

konsol penceresinde i bir uyarı mesajı görüyordum, openh264 kullanmadan önce "kütüphane openh264 yüklenemedi https://github.com/cisco/openh264/releases " yüzden ben programı çalıştırdığınızda şimdi, ben farklı bir hata görüyorum & programım dosyası (exe) ile bir klasörde muhafaza dll indirilen

(video kaydedilmedi edildi)" [OpenH264] this = 0x0DE312C0, uyarı: bEnabledFrameSkip = 0, bitrate kontrol edilemez " atlama çerçevesini etkinleştirmeden RC_QUALITY_MODE ve RC_TIMESTAMP_MODE (şimdi video kaydediliyor, ancak boyut çok yüksek!" bit hızı yaklaşık 1200 Kbps)

benim için, h264 kullanmanın tek amacı dosya boyutunu azaltmaktır. Ben bu hatayı kaldırmak için bazı değişikliklerle openh264 kendim inşa etmek zorunda kalabileceğimi düşünüyorum, herkes bana nasıl yardımcı olabilir ? veya kod aracılığıyla bir şekilde bit oranını azaltmanın bir yolu var mı söyle?

PS: Ben vererek -1 CV_FOURCC(), benim sistemde 'yüklü kodek penceresi geldi yerine, ben h264 veya x264 bulmak veya i codec'i çeşitliliği yüklemiş olsa h264vfw yargılayan & h264 den paketleri here

Teşekkür & Saygılarımızla

sadece RC_BITRATE_MODE kullanarak ve Openh264 içinde bEnableFrameSkip sağlayan bit hızını kontrol edebilir

cevap

2

, Bir Örnek olarak hem

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


Burada gösteriyorum tüm Openh264 Kodlama parametreleri kullanmak zorunda:

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); 

o size yardımcı olacaktır Umut.

+2

Teşekkür için teşekkürler Cevap, bu kod için düşünüyorum, ben openh264 kütüphaneleri eklemek zorundayım ve görsel stüdyosunda dosyaları dahil. Bunu nasıl başarabilirim? Open264 kütüphanelerini kendim inşa etmem gerekiyor mu yoksa pencereler için önceden derlenmiş kütüphaneler alabilir miyim? Araıyorum ama fazla gitmiyorum. [Bu] denedim (http: // stackoverflow.com/questions/30045356/yapamaz-build-openh264-lib-for-windows) ama işe yaramadı (Visual Studio'da başarısız oldu) herhangi bir yararlı bağlantınız var mı? Teşekkürler –

+3

Görsel stüdyo kullanarak Openh264 oluşturmak zorundasınız: i) Download OpenH264 kaynak kodu cisco tarafından sağlanmıştır ii) Görsel stüdyo uyumlu proje/OpenH264/codec/build/win32/dec ve/OpenH264/codec/build/win32/enc dizini. iii) NASM yazılımını indirmeniz gerekiyor iv) Daha sonra tüm bu görsel stüdyo projelerine NASM yürütülebilir yolunu ekle v) Ardından genel seçeneklerde durağan veya dinamik kütüphaneyi seçebilirsiniz. vi) Son olarak, herhangi bir görsel stüdyo projesinde kullanılabilen 5 farklı proje .lib veya .dll dosyasına sahip olacaksınız. – RajibTheKing

+0

** Video dosya adını ** nasıl 'video_file.mp4'' 'encoderParemeters' içine giriyorum? EncoderParemeters'da değilse, kodlayıcıya bunun veriyi kodlamak için video dosyam olduğunu başka bir yere söyleyebilirim. @RajibTheKing Lütfen [http://stackoverflow.com/questions/46760839/paramvalidationext-error-with-welsinitencoderext-failed-while-setting-up-openh26] adlı soruya bir göz atabilir misiniz? Çok benzer, OpenH264'te kodlayıcıyı kurmakla ilgili. şimdiden teşekkürler –

1

. Bit hızını kontrol etmek istiyorsanız

+0

Cevabınız için teşekkürler. Daha önce Openh264 kullanmamıştım. Ben sözde söyledim, ben sadece dll dosyası yürütülebilir dizinde kopyalamıştı .. bu yüzden bEnableSkip frame'i etkinleştirmeyi düşünüyorum, görsel stüdyo projesinde open264 başlık dosyalarını ve statik kütüphaneleri dahil etmeliyim? Bunun için herhangi bir yararlı bağlantılar? [Bu] denedim (http://stackoverflow.com/questions/30045356/unable-to-build-openh264-lib-for-windows) ama çalışmadı (derleme görsel stüdyoda başarısız oldu) Teşekkürler –