मैं यहां पूछने के लिए था, मैं एक एवीफ़्रेम को ओपनग्ल बनावट में कैसे परिवर्तित कर सकता हूं। असल में, मैंने एक रेंडरर बनाया जो मुझे ऑडियो (ऑडियो काम कर रहा है) और वीडियो आउटपुट करता है, लेकिन वीडियो आउटपुट नहीं कर रहा है। यहाँ मेरी कोड है:ओपनजीएल बनावट के लिए एफएफएमपीईजी
बनावट सृजन:
glGenTextures(1,&_texture);
glBindTexture(GL_TEXTURE_2D,_texture);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
कोड जानकारी: _texture चर एक GLuint कि बनावट आईडी
समारोह कि AVFrame हो जाता है और यह ओपन बनावट में बदलने का रहता है :
int VideoGL::NextVideoFrame(){
// Get a packet from the queue
AVPacket *videopacket = this->DEQUEUE(VIDEO);
int frameFinished;
if(videopacket!=0){
avcodec_decode_video2(_codec_context_video, _std_frame,&frameFinished,videopacket);
if(frameFinished){
sws_scale(sws_ctx, _std_frame->data, _std_frame->linesize, 0, _codec_context_video->height, _rgb_frame->data, _rgb_frame->linesize);
if(_firstrendering){
glBindTexture(GL_TEXTURE_2D,_texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, _codec_context_video->width,_codec_context_video->height,0,GL_RGB,GL_UNSIGNED_BYTE,_rgb_frame->data[0]);
_firstrendering = false;
}else{
glActiveTexture(_texture);
glBindTexture(GL_TEXTURE_2D,_texture);
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,_codec_context_video->width,_codec_context_video->height,GL_RGB,GL_UNSIGNED_BYTE,_rgb_frame->data[0]);
}
av_free_packet(videopacket);
return 0;
}else{
av_free_packet(videopacket);
return -1;
}
}else{
return -1;
}
return 0;
}
कोड जानकारी: एक कतार है जहां एक धागा AVFrames स्टोर करता है, इस फ़ंक्शन को अक्सर AVFrames प्राप्त करने के लिए बुलाया जाता है, जब तक कि यह न्यूल हो जाता है, इसे कॉल करने के लिए रोक दिया जाता है।
यह वास्तव में काम नहीं कर रहा है। (मैंने स्टैक ओवरफ़्लो में कुछ प्रश्नों को देखने का प्रयास किया, यह अभी भी काम नहीं कर रहा है) कोई उदाहरण, या कोई ऐसा जो मुझे किसी भी त्रुटि को सही करने में मदद करता है?
अतिरिक्त डाटा: मैं GL_RGBA को GL_RGB बदलने की कोशिश की और प्रारूपों के साथ खेलना शुरू किया, वैसे भी यह दुर्घटनाओं जब मैं GL_RGBA कोशिश (क्योंकि चौड़ाई और ऊंचाई बहुत विशाल हैं, वैसे भी मैं उन्हें आकार बदलने के लिए करने की कोशिश की)। मैंने आकारों को 2 में पावर बदलने की कोशिश की है, अभी भी काम नहीं कर रहा है।
1 संपादित करें:
धागा समारोह:
DWORD WINAPI VideoGL::VidThread(LPVOID myparam){
VideoGL * instance = (VideoGL*) myparam;
instance->wave_audio->Start();
int quantity=0;
AVPacket packet;
while(av_read_frame(instance->_format_context,&packet) >= 0){
if(packet.stream_index==instance->videoStream){
instance->ENQUEUE(VIDEO,&packet);
}
if(packet.stream_index==instance->audioStream){
instance->ENQUEUE(AUDIO,&packet);
}
}
instance->ENQUEUE(AUDIO,NULL);
instance->ENQUEUE(VIDEO,NULL);
return 0;
}
धागा निर्माण कार्य:
CreateThread(NULL, 0, VidThread, this, NULL, NULL);
कहाँ इस वर्ग कि NextVideoFrame शामिल करने के लिए संदर्भित करता है, और _texture सदस्य हैं।
हल:
मैं datenwolf सुझावों में से कुछ का पालन किया है, और अब वीडियो ऑडियो/वीडियो के साथ सही ढंग से प्रदर्शित कर रहा है:
क्या आपके द्वारा उल्लिखित माध्यमिक धागे पर या अगला धागे पर 'NextVideoFrame()' चल रहा है? – genpfault
मैं CreateThread और थ्रेड पोस्ट करूंगा, यह कोड – Spamdark
कोड को देखकर बेहतर नहीं है। द्वितीयक थ्रेड केवल कतार में AVFrame को संग्रहीत करता है, NextVideoFrame को किसी अन्य स्थान पर कॉल किया जाता है, एक फ़ंक्शन जो NextVideoFrame के साथ बनावट को अद्यतन करता है और फिर इसे स्क्रीन पर खींचता है (opengl) – Spamdark