C++ 使用ffmpeg解码原始H264帧时出错

C++ 使用ffmpeg解码原始H264帧时出错,c++,ffmpeg,decode,h.264,C++,Ffmpeg,Decode,H.264,我真的很感激在这个问题上能得到一些帮助。我是FFmpeg的新手,所以如果这是一个愚蠢的问题,请原谅我 我有一个应用程序,通过UDP将H264原始数据从相机中流化。这种交流很有效。问题是在尝试解码时 我只是想解码我收到的数据,以便将一些计算机视觉技术应用到另一个项目中 我打电话后就出现了错误-22 avcodec_send_packet 你们知道会是什么吗?这是我的部分代码 Mat DecodificadorH264::h264decode(char* rawH264, int size){

我真的很感激在这个问题上能得到一些帮助。我是FFmpeg的新手,所以如果这是一个愚蠢的问题,请原谅我

我有一个应用程序,通过UDP将H264原始数据从相机中流化。这种交流很有效。问题是在尝试解码时

我只是想解码我收到的数据,以便将一些计算机视觉技术应用到另一个项目中

我打电话后就出现了错误-22

avcodec_send_packet
你们知道会是什么吗?这是我的部分代码

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;
 ....
AVU return返回AVERROREINVAL,定义为-22

有什么问题吗


提前谢谢

到目前为止,我发现了一个问题:

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
根据: 定义AVERROR_INVALIDDATA AVERROREINVAL 处理输入时发现无效数据


因此,结果是EINVAL是有意义的,因为您传入了堆栈上的&data,并且使用size参数,它读取堆栈就像它是实际的编码视频数据一样。

您还需要一个步骤来创建可用的解码上下文:avcodec\u open2


我正在尝试将char*转换为uint8\u t*,对此表示抱歉。现在我正在播放av_packet.data=uint8_t*rawH264。但是,仍然得到了相同的错误。你对它可能是什么有任何其他的建议吗?我不是说我现在正在使用API,但是看看一些例子,看看你是否正确地使用它。还要确认您的UDP通信流传输的数据和大小是否正确;也许先试试TCP。如果没有其余的代码,很难说是什么错了。
codec = avcodec_find_decoder (AV_CODEC_ID_H264);
context = avcodec_alloc_context3 (codec);
AVDictionary *dict = nullptr;
avcodec_open2(context, codec, &dict);