2010-07-08 5 views
1

그래서 그 API에 이런 일이 무언가 만드는 방법 : 가능FFmpeg lib에 프레임을 (가능한) 형식으로 인코딩하는 함수를 만드는 방법은 무엇입니까?

Encoder = EncoderFormat(format name); // prepare encoder 
//...code for frames generation... now we want to encode frame!// 
EncodeFrame(const CImage* src, void* dest, int* is_keyframe, more args if needed); 

인가를? 어느 누구도 그러한 것을 만드는 방법에 대한 간단한 예를 제공 할 수 있습니까?

답변

1

전역 변수와 같이 매우 나쁜 프로그래밍 습관을 사용하지 않고는 불가능합니다. 프레임의 인코딩은 독립적이지 않습니다. 인코더는 매번 인코더 함수에 포인터를 전달해야하는 상태 (컨텍스트)를 유지해야합니다. 기존 엔코더 컨텍스트를 닫고 새 엔코더 컨텍스트로 전환하지 않고도 프레임 당 형식을 선택할 수 없으므로 EncodeFrame에 형식 선택을 전달하는 아이디어는 다소 어리 석습니다.

원본 이미지가 이미 형식으로되어 있지 않으면 래퍼가 변환해야하는 인코더 (YUV 4 : 2 : 0)가 필요합니다. 이것은 독자적으로하거나 ffmpeg에서 libswscale을 사용하여 수행 할 수 있습니다. 각 프레임에도 타임 스탬프를 제공해야합니다. 그런 것에 대해 걱정할 필요가없는 간단한 API를 원한다면 avav 코덱 컨텍스트 포인터를 감싸고 싶을 것입니다. libavcodec은 실행중인 타임 스탬프 값, swscale 컨텍스트 포인터 등을 유지하는 또 다른 구조를 제공합니다.

그 외에도 API는 대상 버퍼의 크기를 지정할 방법이 없으므로 완전히 안전하지 않습니다. 호출자의 버퍼에 쓰는 대신 인코딩 된 프레임 크기와 함께 내부 버퍼에 대한 포인터 (반환 값 또는 포인터에서 포인터로의 인수를 통해)를 반환하는 것이 더 좋을 수 있습니다.

+0

일반적으로 내가 그런 API를 물어 보았을 때 나는 그것을보고 싶어하는 추상화 (일반화)를한다. 이러한 "단순한"API는 안전하지 않습니다. 그리고 나도 괜찮아요. 왜냐하면 저는 멋진 멋진 실제 프로그램을 만들지 않을 것이기 때문입니다. - 프레임을 인코딩하기위한 간단한 도구가 필요합니다 (프레임 생성은 정말로 흥미로운 부분입니다). 그래서 요점은 - 안전하지 않거나 나쁜 습관 일 경우 - 확인 - 한번 시도해보십시오! 당연히 PC를 깔아 뭉개 버릴 것이다. 나는 행복하지 않을 것이다. 그러나 만일 그것이 jub를하면 나는 나의 프로토 타입을 가지고 행복해 할 것이다. – Rella

관련 문제