使用ffmpeg解码Raw H264帧时出错

时间:2017-04-04 21:28:29

标签: c++ ffmpeg decode h.264

我非常感谢这个问题的一些帮助。我是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;
 ....

av_return返回&#34; AVERROR(EINVAL)&#34;,定义为-22

可能是什么问题?

提前致谢!

2 个答案:

答案 0 :(得分: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是有道理的,因为你传入了堆栈上的数据,并且使用size参数,它正在读取堆栈,好像它是实际编码的视频数据。

答案 1 :(得分:0)

您还需要一步来制作可用的解码上下文:avcodec_open2()

codec = avcodec_find_decoder (AV_CODEC_ID_H264);
context = avcodec_alloc_context3 (codec);
AVDictionary *dict = nullptr;
avcodec_open2(context, codec, &dict);