2013-12-12 4 views
2

У меня есть поток содержимого буфера, который фактически содержит изображение ARGB размером 480x800 [размер байта размером 480 * 800 * 4]. Я хочу кодировать около 10 000 с похожих изображений в поток h.264 с указанными fps (12). this показывает, как кодировать изображения в кодированное видео, но требует ввода для yuv420.Android Encode h264 с помощью libavcodec для ARGB

Теперь у меня есть ARGB изображение, я хочу, чтобы закодировать в CODEC_ID_H264 How to convert RGB from YUV420p for ffmpeg encoder? показывает, как сделать это для RGB24, но как это сделать для RGB32, то есть данные изображений ARGB

как я использую кодек для этого?

EDIT: я нашел How to convert RGB from YUV420p for ffmpeg encoder? Но я не понимаю.

С 1-го звена я узнал, что структура AVFrame содержит данные [0], данные 1, данные [2], которые заполнены Y, U & V значениями.

В 2 звена, они показали, как использовать sws_scale для преобразования RGB24 в YUV420 как таковой

SwsContext * ctx = sws_getContext(imgWidth, imgHeight, 
           AV_PIX_FMT_RGB24, imgWidth, imgHeight, 
           AV_PIX_FMT_YUV420P, 0, 0, 0, 0); 
uint8_t * inData[1] = { rgb24Data }; // RGB24 have one plane 
int inLinesize[1] = { 3*imgWidth }; // RGB stride 
sws_scale(ctx, inData, inLinesize, 0, imgHeight, dst_picture.data, dst_picture.linesize) 

Здесь я предполагаю, что rgb24Data является буфером, содержащим RGB24 байты изображения.

Так как я использую эту информацию для ARGB, которая 32 бит? Нужно ли мне вручную снимать альфа-канал или любую другую работу?

Спасибо

ответ

1

Просто переключитесь вне PixelFormat и линий походки от RGB24 до ARGB

SwsContext * ctx = sws_getContext(imgWidth, imgHeight, 
           AV_PIX_FMT_ARGB, imgWidth, imgHeight, 
           AV_PIX_FMT_YUV420P, 0, 0, 0, 0); 
uint8_t * inData[1] = { rgb24Data }; // RGB24 have one plane 
int inLinesize[1] = { 4*imgWidth }; // RGB stride 
sws_scale(ctx, inData, inLinesize, 0, imgHeight, dst_picture.data, dst_picture.linesize) 
+0

Спасибо, я постараюсь это и обновление. Кроме того, это означает, что я могу попробовать AV_PIX_FMT_RGB565, если мой вход RGB565, и поддерживает ли sws_scale RGB565? – nmxprime

+0

Во время компиляции я получаю неизвестное имя типа 'SwsContext', хотя я включил swscale.h. – nmxprime

+0

. У этого должен быть свой собственный вопрос. – szatmary