, 내가는 FFmpeg와 안돼서, 나는이를 연주 할 때 나는비디오 너무 빨리는 FFmpeg
...이 시간을 날짜까지 좋은 자습서를 찾을 수 없습니다 비디오가 ffmpeg로 재생되면 너무 빠르게 재생됩니다. ffmpeg는 FPS를 무시하고 있으며, 스레드 수면을 처리하고 싶지 않습니다. 비디오에는 FPS가 다릅니다.
AVPacket framepacket;
while(av_read_frame(formatContext,&framepacket)>= 0){
pausecontrol.lock();
// Is it a video or audio frame¿?
if(framepacket.stream_index==gotVideoCodec){
int framereaded;
// Video? Ok
avcodec_decode_video2(videoCodecContext,videoFrame,&framereaded,&framepacket);
// Yeah, did we get it?
if(framereaded && doit){
AVRational millisecondbase = {1,1000};
int f_number = framepacket.dts;
int f_time = av_rescale_q(framepacket.dts,formatContext->streams[gotVideoCodec]->time_base,millisecondbase);
currentTime=f_time;
currentFrameNumber=f_number;
int stWidth = videoCodecContext->width;
int stHeight = videoCodecContext->height;
SwsContext *ctx = sws_getContext(stWidth, stHeight, videoCodecContext->pix_fmt, stWidth,
stHeight, PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL);
if(ctx!=0){
sws_scale(ctx,videoFrame->data,videoFrame->linesize,0,videoCodecContext->height,videoFrameRGB->data,videoFrameRGB->linesize);
QImage framecapsule=QImage(stWidth,stHeight,QImage::Format_RGB888);
for(int y=0;y<stHeight;y++){
memcpy(framecapsule.scanLine(y),videoFrameRGB->data[0]+y*videoFrameRGB->linesize[0],stWidth*3);
}
emit newFrameReady(framecapsule);
sws_freeContext(ctx);
}
}
}
if(framepacket.stream_index==gotAudioCodec){
// Audio? Ok
}
pausecontrol.unlock();
av_free_packet(&framepacket);
}
모든 아이디어 :
난 당신이 루프를 찾을 수 있습니다,이 스레드를 생성?
비디오에서 FPS 정보를 얻을 수 있습니까? – nhahtdh
예. 저 할 수 있어요. 글쎄, 나는 인터넷에서 찾고있다. 스레드 수면은 어떤 생각 일 수 있는가? 스레드를 잠 그어도 오디오를 재생해야합니다. 오디오 디코딩도 또한 악화 될 것입니다 ... – Spamdark
이 작업을 수행하는 데 경험이 없지만 렌더링 및 디코딩 단계를 분리 할 수 있습니까? (렌더링은 1/FPS 초마다 잠자기 후 디코딩 된 버퍼에서 소비되며 버퍼가 채워질 때까지 디코딩 단계가 계속됩니다 - 소비자 - 생산자 종류의 구조). – nhahtdh