簡體   English   中英

使用libavcodec for ARGB的Android Encode h264

[英]Android Encode h264 using libavcodec for ARGB

我有一個緩沖區內容流,其中實際上包含480x800大小的ARGB圖像[大小為480 * 800 * 4的字節數組]。 我想以指定的fps(12)將大約10,000幅相似的圖像編碼為h.264流。 顯示了如何將圖像編碼為編碼的視頻,但是要求輸入的是yuv420。

現在我有ARGB圖像,我想編碼為CODEC_ID_H264 如何將YUV420p的RGB轉換為ffmpeg編碼器? 顯示了如何針對rgb24進行操作,但針對rgb32進行操作(表示ARGB圖像數據)

我該如何使用libavcodec?

編輯:我發現如何從ffmpeg編碼器的YUV420p轉換RGB? 但是我不明白。

從第一個鏈接,我知道AVFrame結構包含由Y,U和V值填充的data [0],data 1 ,data [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圖像字節的緩沖區。

那么,我如何將這些信息用於32位的ARGB? 我是否需要手動剝離Alpha通道或其他解決方法?

謝謝

只需將像素格式和行距從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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM