Tôi đã ở đây để hỏi, làm thế nào tôi có thể chuyển đổi một AVFrame thành một kết cấu opengl. Trên thực tế, tôi đã tạo trình kết xuất kết quả đầu ra cho tôi âm thanh (Âm thanh đang hoạt động) và video, nhưng video không xuất ra. Đây là mã của tôi:FFMPEG to OpenGL Texture
tạo Texture:
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);
Mã Thông tin: _texture biến là một GLuint mà giữ kết cấu ID
Chức năng này sẽ nhận được AVFrame và chuyển nó sang OpenGL Texture :
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;
}
Thông tin mã: Có hàng đợi nơi một luồng lưu trữ các hình ảnh AVFrames, chức năng này thường được gọi để nhận được các hình ảnh AVFrames, cho đến khi nó nhận được một NULL nó dừng lại để được gọi.
Điều đó thực sự không hoạt động. (Tôi đã cố gắng xem xét một số câu hỏi trong ngăn xếp tràn, nó vẫn không hoạt động) Bất kỳ ví dụ nào, hoặc ai đó giúp tôi sửa bất kỳ lỗi nào ở đó?
dữ liệu bổ sung: tôi đã cố gắng để thay đổi GL_RGB để GL_RGBA và bắt đầu chơi với các định dạng, dù sao nó bị treo khi tôi cố gắng GL_RGBA (Bởi vì chiều rộng và chiều cao là rất lớn, dù sao tôi đã cố gắng để thay đổi kích cỡ chúng). Tôi đã cố gắng thay đổi kích cỡ thành Power Of 2, ảnh tĩnh không hoạt động.
1 Chỉnh sửa:
Chủ đề chức năng: chức năng tạo
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;
}
Ðề tài:
CreateThread(NULL, 0, VidThread, this, NULL, NULL);
đâu này đề cập đến các lớp có chứa các NextVideoFrame, và các thành viên _texture.
quyết:
Tôi đi theo một số lời khuyên datenwolf, và bây giờ video được hiển thị chính xác với audio/video:
Có phải 'NextVideoFrame()' đang chạy trên chuỗi phụ mà bạn đã đề cập hoặc trên chuỗi chính không? – genpfault
Tôi sẽ đăng chủ đề CreateThread và chủ đề, Tốt hơn là bạn không nên xem nó ở mã – Spamdark
Chủ đề thứ cấp chỉ lưu AVFrame vào hàng đợi, NextVideoFrame được gọi ở một vị trí khác, một hàm cập nhật kết cấu với NextVideoFrame và sau đó vẽ nó lên màn hình (opengl) – Spamdark