2012-03-26 4 views
3

glReadPixels()에서 생성 된 rgb 데이터 배열이 있습니다.
RGB 데이터는 픽셀로 패킹 된 것입니다 (r1, g1, b1, r2, g2, b2, ...).OpenCV 또는 다른 이미지 처리 라이브러리를 사용하여 RGB 데이터에서 YUV 420 비디오 프레임을 쓰는 방법은 무엇입니까?

OpenCV 또는 다른 C++ 라이브러리를 사용하여 YUV 비디오 프레임을 빠르게 쓸 수 있으므로 FFMPEG로 스트리밍 할 수 있습니까? 온라인에서 사용할 수있는 많은 변환 공식이 있으므로 RGB 픽셀을 YUV 픽셀로 변환하는 것은 문제가되지 않습니다. 그러나 YUV 프레임을 쓰는 것이 나를위한 주요 문제입니다. 지난 며칠 동안 YUV 비디오 프레임을 쓰려고 시도했지만 성공하지 못했습니다.

이것은 YUV 프레임을 작성하는 데 관한 또 다른 질문 중 하나입니다. Issue with writing YUV image frame in C/C++ YUV 프레임을 파일에 쓰는 현재의 접근 방식에 어떤 문제가 있는지 알 수 없습니다.

지금은 기존 라이브러리 (있는 경우)를 사용하고 RGB 데이터를 받아 YUV로 변환하고 YUV 프레임을 파일이나 파이프에 직접 쓸 수 있습니다. 물론 기존의 프로그램을 수정하여 YUV 프레임을 작성할 수 있다면 더 좋을 것입니다. 그러나 모든 소프트웨어 개발 프로젝트에 마감 기한이 있습니다. 따라서 저와 프로젝트 팀 구성원들에게도 시간이 우선입니다.

+0

FFMPEG에서 swscale을 사용해 보셨나요? swscale을 사용하여 픽셀 형식을 변환하고 이미지 크기를 조정하려면 3 줄의 코드 만 필요합니다. – BlueWanderer

+1

왜 YUV 데이터를 FFmpeg로 스트리밍해야합니까? 왜 RGB 데이터를 공급하지 않는가? – TheJuice

+0

YUV 프레임을 작성하는 데 라이브러리가 필요하지 않습니다. 당신은 RGB 데이터를 Y, U, V로 변환 할 수 있다고 말했습니다. 같은 순서로 파일에 그 데이터를 씁니다. 대체 값을 사용하여 U & V를 서브 샘플링 할 수 있습니다. 그런 다음 해당 파일을 보려면 좋은 YUV 플레이어가 필요합니다. 나는 이것을 여러 번했는데, 매우 쉽다. – nac

답변

0

OpenCV는 알고있는 것처럼 직접 YUV 형식을 지원하지 않으므로 RGB < -> YUV 변환을 찾는 방법은 사용자에게 달려 있습니다.

This is a very interesting post가로드 IplImage으로 데이터를 저장하면서, 디스크에 YUV 프레임을 생성하는 방법 같이.

0

ffmpeg는 YUV를 사용하여 AVI 파일을 작성하지만 karl은 openCV에서 직접 지원하지 않는다고 말합니다.

또는 UYVY 값을 파일에 쓰고 ffmpeg를 사용하여 원하는 형식으로 AVI/MP4로 변환 할 수 있습니다. 파이프에 직접 쓰고 임시 yuv 파일을 피하기 위해 앱에서 직접 ffmpeg를 호출 할 수도 있습니다

예 : 초당 30 프레임

에서 H264의 MP4 파일에 HD YUV422 스트림을 변환하는 ffmpeg -pix_fmt yuyv422 -s 1920x1080 -i input.yuv -vcodec libx264 -x264opts -r 30 output.mp4

+0

OpenGL 응용 프로그램을 실행하고 glReadPixels를 사용하여 애니메이션 표시를 캡처 한 다음이 데이터를 FFMPEG로 파이프하고 Red5를 사용하여 RTMP 라이브 스트리밍으로 웹 브라우저로 스트리밍하려고합니다. kylecordes.com/2007/pipe-ffmpeg 및 기타 관련 웹 사이트에서 FFMPEG가 파이프를 통해 RTMP 스트리밍 데이터를 수신 할 수 있지만 데이터는 YUV 비디오 프레임 형식으로 인코딩되어야한다는 사실을 알게되었습니다. 저를 올바른 접근 방식으로 안내 할 수 있습니까? 여기에 내 현재 접근 방식은 http://stackoverflow.com/questions/9858388/입니다. http://wiki.multimedia.cx/index.php?title=YUV4MPEG2 –

+0

@all_by_grace - RGB로 화면을 읽고 있다면 그 값을 직접 쓰는 것이 더 간단하지 않습니까? ffmpeg 및 openCV 모두 RGB 픽셀 형식의 비디오를 만들 수 있습니다. ps 당신은 매우 공상적인 레이드 시스템이 없다면 두 경우 모두 매우 높은 프레임 속도를 처리 할 수 ​​없을 것입니다. –

2
는 FFmpeg 행복에 RGB 데이터를 수신합니다

당신은 어떤 픽셀 실행하여는 FFmpeg을 지원하는 형식을 볼 수 있습니다.

ffmpeg -pix_fmts 

모든 항목을 첫 번째 열에 I이있는 숫자를 입력으로 사용할 수 있습니다.

픽셀 비트 심도를 지정하지 않았으므로 8 비트라고 가정하고 rgb8 픽셀 형식을 사용합니다.

cat data.rgb | ffmpeg -f rawvideo -pix_fmt rgb8 -s WIDTHxHEIGHT -i pipe:0 output.mov 

가없는 프레임과 원시 픽셀 포맷이기 때문에 : 그래서 당신은 (나는에 cat ING 데이터를 모르지만, 당신이 당신의 파이프를 통해 공급 될 것이다) 다음 명령을 사용 stdin에서 rgb8 데이터를 읽을 수는 FFmpeg를 얻을 수 FFmpeg가 데이터를 프레임하는 방법을 알 수 있도록 이미지 크기의 적절한 값에 대해 WIDTH 및 HEIGHT를 보조해야합니다.

출력을 MOV 파일로 지정했지만 그에 맞게 FFmpeg/Red5 출력을 구성해야합니다.