我在這裏問,我怎樣才能將AVFrame轉換爲opengl紋理。實際上,我創建了渲染器,輸出音頻(音頻正在工作)和視頻,但視頻不輸出。這裏是我的代碼:FFMPEG到OpenGL紋理
紋理製作:
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變量是保持紋理ID
該功能可以獲取AVFrame並將其轉換爲OpenGL的紋理GLuint :
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,直到它獲得一個NULL,它就停止被調用。
這實際上不起作用。 (我試圖看看堆棧溢出中的一些問題,但它仍然不起作用) 任何示例或幫助我糾正錯誤的人?
其他數據:我試圖改變GL_RGB到GL_RGBA並開始與格式的播放,反正它崩潰當我嘗試GL_RGBA(因爲寬度和高度都是非常大的,反正我試圖調整它們的大小)。我曾嘗試將尺寸更改爲Power Of 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 2013-02-11 21:42:05
我將發佈CreateThread和線程,它更好地隱藏它看代碼 – Spamdark 2013-02-11 21:43:27
輔助線程只將AVFrame存儲到隊列中,NextVideoFrame在另一個地方被調用,該功能用NextVideoFrame更新紋理,然後把它畫到屏幕上(opengl) – Spamdark 2013-02-11 21:46:43