我正在尝试使用Live555通过RTSP流式传输基于H264的数据。
我正在使用V4L2捕获数据,然后使用FFMPEG对其进行编码,然后将数据传递到Live555的DeviceSource文件中,因为我使用的是H264VideoStreamFramer类,
下面是我的编解码器设置,用于配置编码器的AVCodecContext,
codec = avcodec_find_encoder_by_name(CODEC_NAME);
if (!codec) {
cerr << "Codec " << codec_name << " not found\n";
exit(1);
}
c = avcodec_alloc_context3(codec);
if (!c) {
cerr << "Could not allocate video codec context\n";
exit(1);
}
pkt = av_packet_alloc();
if (!pkt)
exit(1);
/* put sample parameters */
c->bit_rate = 400000;
/* resolution must be a multiple of two */
c->width = PIC_HEIGHT;
c->height = PIC_WIDTH;
/* frames per second */
c->time_base = (AVRational){1, FPS};
c->framerate = (AVRational){FPS, 1};
c->gop_size = 10;
c->max_b_frames = 1;
c->pix_fmt = AV_PIX_FMT_YUV420P;
c->rtp_payload_size = 30000;
if (codec->id == AV_CODEC_ID_H264)
av_opt_set(c->priv_data, "preset", "fast", 0);
av_opt_set_int(c->priv_data, "slice-max-size", 30000, 0);
/* open it */
ret = avcodec_open2(c, codec, NULL);
if (ret < 0) {
cerr << "Could not open codec\n";
exit(1);
}
我正在使用avcodec_receive_packet()函数获取编码数据。它将返回AVPacket。
我正在将AVPacket的数据传递到DeviceSource文件中,这是我的Live555代码的代码段:
void DeviceSource::deliverFrame() {
if (!isCurrentlyAwaitingData()) return; // we're not ready for the data yet
u_int8_t* newFrameDataStart = (u_int8_t*) pkt->data;
unsigned newFrameSize = pkt->size; //%%% TO BE WRITTEN %%%
// Deliver the data here:
if (newFrameSize > fMaxSize) { // Condition becomes true many times
fFrameSize = fMaxSize;
fNumTruncatedBytes = newFrameSize - fMaxSize;
} else {
fFrameSize = newFrameSize;
}
gettimeofday(&fPresentationTime, NULL); // If you have a more accurate time - e.g., from an encoder - then use that instead.
// If the device is *not* a 'live source' (e.g., it comes instead from a file or buffer), then set "fDurationInMicroseconds" here.
memmove(fTo, newFrameDataStart, fFrameSize);
}
但是在这里,有时我的数据包的大小超过了 fMaxSize 值,并且按照LIVE555逻辑,它将截断帧数据,因此有时我的VLC上出现了坏帧,
从Live555论坛上,我知道编码器不应发送大小大于fMaxSize值的数据包,所以我的问题是:
如何限制编码器限制数据包的大小?
预先感谢
Harshil
答案 0 :(得分:0)
您可以通过更改MediaSink.cpp的OutPacketBuffer类中的“ maxSize”来增加允许的最大样本大小。这对我有用。在某些情况下,我们可能需要流式传输高质量的视频,但我认为我们不会总是能够限制编码器不生成大小超过特定值的样本,而这会导致视频质量问题。实际上,样本是由UDP接收器live555进行分段以匹配默认的MTU(1500),因此增加最大样本大小限制没有副作用。