2017-04-04 159 views
0

我真的很感謝這個問題的一些幫助。我是FFmpeg的新手,因此如果這是一個愚蠢的問題,請原諒我使用ffmpeg解碼Raw H264幀時出錯

我有一個應用程序通過UDP從攝像頭傳輸H264原始數據。該溝通正常。問題是,當試圖解碼

我只是想解碼我收到的數據,以便將一些計算機視覺技術應用到另一個項目。

我打電話

avcodec_send_packet 

有任何影響,你知道會不會是以後的錯誤-22吧?這裏是

Mat DecodificadorH264::h264decode(char* rawH264, int size){ 
... 
... 
AVPacket av_packet; 
av_init_packet(&av_packet); 
uint8_t data; 
data = *rawH264; 
av_packet.data = &data; 
av_packet.size = size; 

cout << "size = "<<av_packet.size; 

int frame_finished = 0; 

l_pCodec = avcodec_find_decoder(AV_CODEC_ID_H264); 

l_pAVCodecContext = avcodec_alloc_context3(l_pCodec); 

l_pAVCodecContext->width = FRAME_WIDTH; 
l_pAVCodecContext->height = FRAME_HEIGHT; 
l_pAVCodecContext->extradata = NULL; 

l_pAVCodecContext->pix_fmt = AV_PIX_FMT_YUV420P; 

int av_return = avcodec_send_packet(l_pAVCodecContext, 
(AVPacket*)&av_packet); 
if (av_return == AVERROR(EINVAL))cout << "codec not opened, or it is an encoder" << endl; 
.... 

av_return返回 「AVERROR(EINVAL)」,其定義爲-22

可能是什麼問題,我的代碼的一部分?

在此先感謝!

回答

1

嗯,我看到一個問題至今:

uint8_t data; 
data = *rawH264; 
av_packet.data = &data; // all you did here is copy the first char from rawH264 into data 

你需要的是

av_packet.data = rawH264; // you might have to cast rawH264 to uint8_t* first 

根據https://ffmpeg.org/doxygen/0.6/error_8h.html: 的#define AVERROR_INVALIDDATA AVERROR(EINVAL) 處理輸入時發現無效數據。

所以有意義的結果是EINVAL,因爲你在棧中傳遞了&數據,並且帶有大小參數,它正在讀取堆棧,就好像它是實際編碼的視頻數據。

+0

我試圖將char *轉換爲uint8_t *,對此抱歉。現在我正在鑄造av_packet.data =(uint8_t *)rawH264。但是,仍然有同樣的錯誤。你有任何其他建議可能是什麼? – raullalves

+0

我不是在聲稱我現在是API,而是看一些例子,看看你是否正確使用它。同時確認您的UDP通信正在傳輸正確的數據和大小;也許先嚐試TCP。沒有代碼的其餘部分,很難說出了什麼問題。 –