2011-05-02 12 views
1

현재 Qt 디자이너 도구를 사용하여 Linux의 웹캠에서 비디오를 캡처하고 C++에서 V4L2 및 ffmpeg 라이브러리를 캡처하여 이미지를 캡처하는 응용 프로그램을 개발 중입니다. lib V4L2를 사용하면 문제가 없습니다. 이후 그 그림은 준비가되어있는 ffmpeg libs에 기초한 인코더로 보내고, 처음에는 인코더가 비디오 파일을 만들고이 파일에서 인코딩 할 이미지를받습니다. 내 문제는 다음과 같습니다 : 인코딩이 정상적으로 완료되었습니다. 하지만 녹화 된 비디오 파일을 재생하기 시작하면 속도가 일반 속도보다 빨라집니다! 그래서 명확한 무엇이, 문제는 비디오 인코딩, 내 질문에, 방법 또는 ffmpeg 속도를 인코딩을 관리하는 기능이 무엇입니까 ????? 도움에 감사드립니다.ffmpeg 속도 인코딩 문제

+0

질문이 C++이나 Qt와 아무런 관계가 없으므로 태그를 적절하게하십시오. – jv42

+0

저는 C++ 언어로 프로그래밍하는 Qt를 사용하고 있기 때문에 제 문제를 중재하고 싶었습니다. – amrouch

+0

그러나 C++ 및 Qt 지식을 가진 사람들은 이러한 태그를 '모니터링'하고 있지만 도움을 줄 수는 없습니다. – jv42

답변

1

는 FFmpeg와 사용자 정의 인코딩 된 비디오를 만들기위한 http://code.google.com/p/qtffmpegwrapper/를 참조하십시오, 당신은 실제로 출력 파일에 기록됩니다 각 AVPacket에 PTS를 설정해야합니다. AVCodecContext의 time_base를 설정하면 (자), 컨테이너에 무엇을 기대할 수 있을지 어떨지를 알립니다. PTS (Presentation Time Stamp)는 특정 프레임을 실제로 표시 할 때 디코더에게 (비디오를 볼 때) 알려줍니다. 예를 들어

:

난 내가는 FFmpeg의 V4L2 부분에서 가져온 AVFrame 있습니다. 시작하려면 av_picture_copy를 사용하여이 이미지의 복사본을 만드는 것이 더 안전합니다. (그래서 인코더는 AVFrame 구조체의 모든 여분의 정보를보고하지 않습니다.)

av_picture_copy((AVPicture*) picture, (AVPicture*) pFrame, c->pix_fmt, c->width, c->height); 

picture->pts = numFrames; 

지금 현재 인코딩하는 인코딩 된 프레임

pDestFrame->pts = numFrames; 

을의 납입에 따라 점을 설정

numEncodedBytes = avcodec_encode_video(AVCodecCtx, buffer, bufferSize, pDestFrame); 

NOW 재조정 후 AVPacket을 만들고 타임 스탬프를 다시 설정하십시오.

AVPacket pkt; 
av_init_packet(&pkt); 

pkt.pts = av_rescale_q(c->coded_frame->pts, c->time_base, mpVideoStr->time_base); 

if (c->coded_frame->key_frame) pkt.flags |= AV_PKT_FLAG_KEY; 

pkt.stream_index = mpVideoStr->index; 
pkt.data = outbuf; 
pkt.size = out_size; 

마지막으로, 당신은 밖으로

av_write_frame(formatCtx, &pkt); 

나는이 H264 비디오 인코딩 작동 알고 패킷을 기록 할 수 있지만 나는 그것이 내가 H264 만 우려하고 있기 때문에, 비디오 다른 유형의 작동 100 % 확실하지 않다 내가 이것을 썼을 때.

0

사진에 타임 스탬프를 추가해야한다고 생각합니다.
FFMpeg는 가능한 한 빨리 인코딩/디코딩을 수행합니다. 너는 너 자신 동기화를 써야한다. 일반적으로 비디오 디코딩 및 재생에서 프레임에 타임 스탬프가 첨부되어 있거나 적어도 오디오 클럭 및 프레임 속도로 일부를 만들 수 있습니다.
그러나 이것은 동기화하려는 방식과 구현 방식에 따라 크게 달라집니다.
아마는 FFmpeg의 tutorial는 당신에게 약간 additionl을 제공 힌트

+0

이 튜토리얼을 본 적이 있지만이 기능은 디코딩 기능 전용으로, 내 디코더는 그 이상으로 작동합니다. 오디오를 사용하지 않고 비디오 스트림을 캡쳐하면 더 쉽게 사용할 수 있습니다. 그래서 문제가 디코더에 있다고 생각하는 것입니다. , 잠시 동안, 나는 특별히 formatcontext, 패킷의 인코더에서 pts를 수정하고 있습니다 ... – amrouch

+0

당신은 tut에서 동기화가 어떻게 수행되는지 볼 수 있습니다. 이 경우 비디오가 오디오에 동기화되는 방법. 귀하의 경우에는 오디오가 없다고 가정합니다. 따라서 비디오 프레임을 표시하는 데 필요한 시간을 결정해야합니다. 예를 들어 각 프레임의 프레임 속도 또는 지속 시간을 사용합니다. – mkaes

+0

미안 해요 "인코딩기"에 문제가 있다는 것을 의미합니다. 디코더가 제대로 작동하고 플레이어 (vlc와 같은)에서 녹화 된 비디오를 재생하면 너무 빨라서 문제가 인코더에있는 것 같습니다. – amrouch

-1

당신이는 FFmpeg 파일을 만들 때 당신이 사용하고있는 라이브러리에 따라 프레임 속도를 지정하고 그렇지 않으면

pCodecContext->time_base.den = frames_per_second; 
pCodecContext->time_base.num = 1; 

처럼 뭔가를보고있다 웹캠에서 10-15fps를 생성하고 있지만 파일의 기본값이 30fps이면 빠르게 재생됩니다.

는 Qt는는 FFmpeg 래퍼

+0

재생 해 주셔서 감사합니다. 저는 현재 인코딩, 디코딩과 같은 Qt ffmpeg 래퍼의 일부 기능을 사용하고 있으며, ** pCodecContext-> time_base.den ** 값을 변경했습니다. 하지만 여전히 동일한 문제가 발생했습니다 – amrouch

+0

내 웹캠에서 얼마나 많은 fps가 생성되는지 어떻게 알 수 있습니까? – amrouch

+0

웹캠 설정에서 설정하거나 이전 실행에서 측정하십시오. 또는 당신이 정말로 까다로운 경우 웹캠을 최고 속도로 돌리지 만 이미지를 버리면 모든 'n'밀리 초마다 정확하게 하나의 새 프레임을 남겨 두십시오. 가장 좋은 옵션은 바로 10-15라는 것을 추측하는 것입니다. DirectShow amcap 샘플 또는 웹캠 뷰어 앱에서 –