将FFMpeg AVPackets解析为h264 nal单位

时间:2014-01-04 08:42:46

标签: ffmpeg h.264 rtsp

我正在使用 FFMpeg 解码实时视频并使用 Live555 对其进行流式传输。我可以解码视频并获取输出AVPackets。
1.使用FFMpeg的SWScale

将BGR图像转换为YUV422P格式
// initilize a BGR To RGB converter using FFMpeg
ctx = sws_getContext(codecContext->width, codecContext->height, AV_PIX_FMT_BGR24, codecContext->width, codecContext->height, AV_PIX_FMT_YUV422P, SWS_BICUBIC, 0, 0, 0);
tempFrame = av_frame_alloc();
int num_bytes = avpicture_get_size(PIX_FMT_BGR24, codecContext->width, codecContext->height);
uint8_t* frame2_buffer = (uint8_t*)av_malloc(num_bytes*sizeof(uint8_t));
avpicture_fill((AVPicture*)tempFrame, frame2_buffer, PIX_FMT_BGR24, codecContext->width, codecContext->height);

// inside the loop of where frames are being encoded where rawFrame is a BGR image
tempFrame->data[0] = reinterpret_cast<uint8_t*>(rawFrame->_data);
sws_scale(ctx, tempFrame->data, tempFrame->linesize, 0, frame->height, frame->data, frame->linesize);

用于解码每个帧

ret = avcodec_encode_video2(codecContext, &packet, frame, &got_output);
if(ret < 0)
{
    fprintf(stderr, "Error in encoding frame\n");
    exit(1);
}

if(got_output)
{
    //printf("Received frame! pushing to queue\n");
    OutputFrame *outFrame = new OutputFrame();
    outFrame->_data = packet.buf->data;
    outFrame->_bufferSize = packet.buf->size;
    outputQueue.push_back(outFrame);
}

直到这里它运作正常。我能够将这些帧写入文件并使用VLC播放。在此之后我必须将输出帧传递给Live555.i认为我在这里获得的AVPackets不需要是Live555所需的单个H264 Nal单元。

如何将AVPacket分解成可以传递给Live555的Nal单元?

1 个答案:

答案 0 :(得分:1)

H264VideoStreamDiscreateFramer需要没有起始代码'\ x00 \ x00 \ x00 \ x01'的数据。 需要删除LiveDeviceSource中的4个第一个字节或插入FramedFilter来完成这项工作。

也许您可以尝试使用H264VideoStreamFramer,例如testH264VideoStreamer测试程序。

如果它可以提供帮助,您可以通过live555实现我的一次尝试,从V4L2捕获实现RTSP服务器提要https://github.com/mpromonet/h264_v4l2_rtspserver