Live555截断FFMpeg的编码数据

问题描述 投票:0回答:1

我正在尝试使用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

我正在尝试通过RTSP使用Live555传输基于H264的数据。我正在使用V4L2捕获数据,然后使用FFMPEG对其进行编码,然后将数据传递到Live555的DeviceSource文件中,因为我使用的是...

c++ ffmpeg h.264 rtsp live555
1个回答
0
投票

您可以通过更改MediaSink.cpp的OutPacketBuffer类中的“ maxSize”来增加允许的最大样本大小。这对我有用。在某些情况下,我们可能需要流式传输高质量的视频,但我认为我们不会总是能够限制编码器不生成大小超过特定值的样本,而这会导致视频质量问题。实际上,样本由UDP接收器live555分段以匹配默认的MTU(1500),因此增加最大样本大小限制没有副作用。

© www.soinside.com 2019 - 2024. All rights reserved.