【问题标题】:Error while decoding Raw H264 frames using ffmpeg使用 ffmpeg 解码原始 H264 帧时出错
【发布时间】:2017-04-04 21:28:29
【问题描述】:

非常感谢您在这个问题上提供的帮助。我是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 返回“AVERROR(EINVAL)”,定义为-22

可能是什么问题?

提前致谢!

【问题讨论】:

    标签: c++ ffmpeg decode h.264


    【解决方案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 是有道理的,因为您传入了 &data,它位于堆栈中,并且使用 size 参数,它正在读取堆栈,就好像它是实际编码的视频数据一样。

    【讨论】:

    • 我试图将 char* 转换为 uint8_t*,对此感到抱歉。现在我正在投射 av_packet.data = (uint8_t*)rawH264。但是,仍然得到同样的错误。你有什么其他建议吗?
    • 我并没有声称我现在是 API,但请看一些示例,看看您是否正确使用它。还要确认您的 UDP 通信正在流式传输正确的数据和大小;也许先尝试 TCP。没有剩下的代码,很难说哪里出了问题。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-06
      • 2013-12-03
      • 2017-04-23
      • 2020-08-12
      • 2013-02-06
      • 2012-07-28
      • 2018-09-19
      • 1970-01-01
      • 2018-06-09
      相关资源
      最近更新 更多