2016-01-05 16 views
7

के साथ ffmpeg के माध्यम से वीडियो डीकोड करते समय मैंने ffmpeg का उपयोग करके एक वीडियो प्लेयर सफलतापूर्वक कार्यान्वित किया है। अब मैं हार्डवेयर डिकोडिंग का उपयोग करने की कोशिश कर रहा हूं लेकिन मुझे कुछ मुद्दों का सामना करना पड़ रहा है। मुझे एक पोस्ट मिला जो मैंने यहां शुरुआती बिंदु के रूप में देखा: http://comments.gmane.org/gmane.comp.video.ffmpeg.libav.user/13523निष्पादित करने में विफल: 0x80070057, dxva2

मैंने कोड को अद्यतन किया है जो डिकोडर के लिए आवश्यक सामग्री सेट करता है। अद्यतन कोड यहाँ उपलब्ध है: https://drive.google.com/file/d/0B5ufHdoDzA4ieVk5UVpxcDNzRHc/view?usp=sharing

और यह मैं इसे कैसे उपयोग कर रहा हूँ विकोडक प्रारंभ करने में है:

// Prepare the decoding context 
AVCodec *codec = nullptr; 
_codecContext = _avFormatContext->streams[_streamIndex]->codec; 
if ((codec = avcodec_find_decoder(_codecContext->codec_id)) == 0) 
{ 
    std::cout << "Unsupported video codec!" << std::endl; 
    return false; 
} 

_codecContext->thread_count = 1; // Multithreading is apparently not compatible with hardware decoding 
InputStream *ist = new InputStream(); 
ist->hwaccel_id = HWACCEL_AUTO; 
ist->hwaccel_device = "dxva2"; 
ist->dec = codec; 
ist->dec_ctx = _codecContext; 
_codecContext->coded_width = _width; 
_codecContext->coded_height = _height; 

_codecContext->opaque = ist; 
dxva2_init(_codecContext); 

_codecContext->get_buffer2 = ist->hwaccel_get_buffer; 
_codecContext->get_format = GetHwFormat; 
_codecContext->thread_safe_callbacks = 1; 

if (avcodec_open2(_codecContext, codec, nullptr) < 0) 
{ 
    std::cout << "Video codec open error" << std::endl; 
    return false; 
} 

और यहाँ ऊपर संदर्भित GetHwFormat की परिभाषा है:

AVPixelFormat GetHwFormat(AVCodecContext *s, const AVPixelFormat *pix_fmts) 
{ 
    InputStream* ist = (InputStream*)s->opaque; 
    ist->active_hwaccel_id = HWACCEL_DXVA2; 
    ist->hwaccel_pix_fmt = AV_PIX_FMT_DXVA2_VLD; 
    return ist->hwaccel_pix_fmt; 
} 

जब मैं एक एमपी 4 (एच 264 में एन्कोड किया गया) वीडियो खोलता हूं जो एचडी रिज़ॉल्यूशन या उससे कम है, तो सब कुछ ठीक काम कर रहा है। हालांकि, जैसे ही मैं 3840x2160 की तरह उच्च संकल्प वीडियो की कोशिश के रूप में, मैं बार-बार निम्न त्रुटियों हो:

Failed to execute: 0x80070057 
Hardware accelerator failed to decode picture 

मैं भी कुछ सेकंड के बाद निम्न त्रुटियों हो रही शुरू:

co located POCs unavailable 

और वीडियो है ठीक से प्रदर्शित नहीं होता है: मुझे पूरे वीडियो में बहुत सारी कलाकृतियों मिलती हैं और यह कमजोर है। मैंने ffmpeg स्रोत कोड में पहली त्रुटि की जांच की। ऐसा लगता है कि एक अवैध पैरामीटर के कारण IDirectXVideoDecoder_Execute विफल रहता है। चूंकि यह ffmpeg के साथ हो रहा है, वहां कुछ ऐसा होना चाहिए जो मुझे याद आ रहा है लेकिन मैं यह नहीं समझ सकता कि क्या। इस त्रुटि के साथ मुझे मिली एकमात्र प्रासंगिक पोस्ट मल्टीथ्रेडिंग की वजह से थी, लेकिन मैंने कोडेक खोलने से पहले thread_count को 1 पर सेट किया था।

  • i7-4790 सीपीयू @ 3.6GHz
  • रैम 16 जीबी
  • Intel HD ग्राफ़िक्स 4600
  • Windows 8.1
  • :

    यह समस्या जो निम्न विनिर्देशों है मेरी मुख्य कंप्यूटर पर हो रहा है

एक ही समस्या मेरे दूसरे कंप्यूटर पर नहीं हो रही है जिसमें निम्नलिखित चश्मे हैं:

  • i7 4510U @ 2GHz
  • रैम 8 जीबी
  • NVIDIA GeForce GTX 750Ti
  • विंडोज 10

अगर मैं अपने मुख्य कंप्यूटर पर DXVAChecker उपयोग करें, यह कहना है कि मेरी ग्राफिक्स कार्ड DXVA2 का समर्थन करता है H264_VLD_ * के लिए, और मैं देख सकता हूं कि माइक्रोसॉफ्ट एपीआई को कॉल किया जा रहा है (डीएक्सवीए 2_DecodeDeviceCreated, DXVA2_DecodeDeviceBeginFrame, DXVA2_DecodeDeviceGetBuffer, DXVA2_DecodeDeviceExecute, DXVA2_DecodeDeviceEndFrame) जबकि मेरा वीडियो चल रहा है।

मुझे हार्डवेयर डिकोडिंग और संस्करण के बिना संस्करण के बीच GPU उपयोग (किसी भी कंप्यूटर पर) में कोई वृद्धि दिखाई नहीं दे रही है; हालांकि, मुझे सीपीयू उपयोग में कमी दिखाई देती है (जितना मैं उम्मीद कर रहा था)। यह भी बहुत अजीब है।

ध्यान दें कि मैंने एफएफएमपीईजी वेबसाइट पर उपलब्ध विंडोज रिलीज और एक संस्करण जिसे मैंने --enable-dxva2 के साथ संकलित किया था। मैंने पहले से ही बहुत कुछ खोजा है लेकिन मैं यह नहीं ढूंढ पाया कि मैं क्या गलत कर रहा हूं।

उम्मीद है कि कोई मेरी मदद कर सकता है, या शायद मुझे एक बेहतर उदाहरण के लिए इंगित कर सकता है?

+0

मैंने आईई 4300 यू @ 1.9GHz (4 सीपीयू), 8 जीबी रैम के साथ एक भूतल प्रो 3 पर भी परीक्षण किया, इंटेल एचडी ग्राफिक्स 4400, विंडोज 10, और वीडियो अच्छा लग रहा है। कोई त्रुटि संदेश नहीं हैं। सीसीयूयू उपरोक्त वर्णित दूसरे कंप्यूटर की तरह हार्डवेयर डिकोडिंग के बिना 40% कम है। जीपीयू 3840x2160 पर उसी वीडियो का परीक्षण करने के लिए केवल 1% या शायद 2% अधिक (जैसा ऊपर वर्णित अन्य 2 कंप्यूटरों के समान है) । – CD83

उत्तर

5

मुझे अंत में पता चला कि मेरी समस्या क्या थी। avcodec_decode_video2 कॉल करने के बाद, मैं इस तरह पैकेट के आकार और डेटा सूचक को अद्यतन करने गया था नहीं:

int r = avcodec_decode_video2(_codecContext, frame, &frameDecoded, &pkt); 
pkt.size -= r; 
pkt.data += r; 

अब, वीडियो ठीक से डीकोड है और मैं कोई कलाकृतियों अब और नहीं है।

इसके अलावा, अंतराल के संबंध में, मेरा मानना ​​है कि यह एक अलग मुद्दा था, त्रुटि संदेशों से संबंधित नहीं था, और उस समय के कारण जब छवि को कॉपी करने के लिए सीपीयू की स्मृति में प्रतिलिपि होती है। यदि आपको ऐसा करने की आवश्यकता है, तो उपरोक्त मेरे प्रश्न के साथ पोस्ट किए गए कोड में av_image_copy_plane का उपयोग करने के बजाय, आप देखना चाहते हैं कि वीएलसी क्या करता है, या इस लिंक पर https://software.intel.com/en-us/articles/copying-accelerated-video-decode-frame-buffers। मैंने अपनी मशीन पर एक त्वरित परीक्षण किया और यह 7 या 8 के कारक द्वारा समय कम कर दिया।

संबंधित मुद्दे