FFMPEG:用多个帧解码h264

时间:2018-04-18 09:58:51

标签: c# video ffmpeg video-streaming

请原谅我对视频解码的了解,我是新手。

我需要将视频帧从h264解码为C#中的位图图像。我正在使用FFmpeg.AutoGen。但不幸的是,我没有得到任何结果。

我可以使用以下数据。

  • nFrameType = IFrame,PFrame或BFrame
  • nSequence =帧序列
  • nWidth =分辨率宽度
  • nHeight =分辨率高度
  • nVideoSize =视频数据的大小
  • pVideo =视频数据

我目前的方法如下(类似于显示here的例子):

初始化

private unsafe AVCodecContext* _codecContext;
private unsafe AVFormatContext* _formatContext;
private unsafe AVFrame* _frame;
AVCodecID codecID;
private unsafe AVCodec* _avCodec;
private bool decoderInitialized = false;

    if (!decoderInitialized)
    {
        if (nCodecType == 2)
        {
            codecID = AVCodecID.AV_CODEC_ID_H264;
        }
        unsafe
        {
            _avCodec = ffmpeg.avcodec_find_decoder(codecID);
            _codecContext = ffmpeg.avcodec_alloc_context3(_avCodec);
            ffmpeg.avcodec_open2(_codecContext, _avCodec, null);
            _frame = ffmpeg.av_frame_alloc();
        }
        decoderInitialized = true;

    }

解码

            AVPacket packet;
            ffmpeg.av_init_packet(&packet);
            packet.data = (byte*)pVideo;
            packet.size = (int)nVideoSize;
            int isFrameFinished = 0;

            int response = ffmpeg.avcodec_decode_video2(_codecContext, _frame, &isFrameFinished, &packet);

我总是得到response = -22isFrameFinished = 0。我确实有一种预感,我在这里做错了什么。但我无法找到一个资源来指导我朝某个方向发展。例如。我知道,我需要使用nFrameType(IFrame,BFrame和PFrame)。但我不知道怎么做?此外,我知道我需要使用宽度和高度来正确解码图像,但同样,我也不知道如何解决它。

1 个答案:

答案 0 :(得分:0)

幸运的是,我解决了这个问题。 我在ffmpeg.avcodec_register_all()之前缺少编解码器ffmpeg.avcodec_find_decoder(codecID)的注册。希望它能帮助别人。