我正在使用 FFMpeg 解码实时视频并使用 Live555 对其进行流式传输。我可以解码视频并获取输出AVPackets。
1.使用FFMpeg的SWScale
// 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单元?
答案 0 :(得分:1)
H264VideoStreamDiscreateFramer需要没有起始代码'\ x00 \ x00 \ x00 \ x01'的数据。 需要删除LiveDeviceSource中的4个第一个字节或插入FramedFilter来完成这项工作。
也许您可以尝试使用H264VideoStreamFramer,例如testH264VideoStreamer测试程序。
如果它可以提供帮助,您可以通过live555实现我的一次尝试,从V4L2捕获实现RTSP服务器提要https://github.com/mpromonet/h264_v4l2_rtspserver