gpt4 book ai didi

c - ffmpeg录制h264直播流出错

转载 作者:行者123 更新时间:2023-11-30 15:19:50 24 4
gpt4 key购买 nike

我正在尝试使用以下代码录制 h.264 直播流:

   AVOutputFormat* fmt = av_guess_format(NULL, "test.mpeg", NULL);
AVFormatContext* oc = avformat_alloc_context();
oc->oformat = fmt;
avio_open2(&oc->pb, "test.mpeg", AVIO_FLAG_WRITE, NULL, NULL);
AVStream* stream = NULL;
...
while(!done)
{

// Read a frame
if(av_read_frame(inputStreamFormatCtx, &packet)<0)
return false;

if(packet.stream_index==correct_index)
{
////////////////////////////////////////////////////////////////////////
// Is this a packet from the video stream -> decode video frame
if (stream == NULL){//create stream in file
stream = avformat_new_stream(oc, pFormatCtx->streams[videoStream]->codec->codec);
avcodec_copy_context(stream->codec, pFormatCtx->streams[videoStream]->codec);
stream->sample_aspect_ratio = pFormatCtx->streams[videoStream]->codec->sample_aspect_ratio;

stream->sample_aspect_ratio.num = pFormatCtx->streams[videoStream]->codec->sample_aspect_ratio.num;
stream->sample_aspect_ratio.den = pFormatCtx->streams[videoStream]->codec->sample_aspect_ratio.den;

// Assume r_frame_rate is accurate
stream->r_frame_rate = pFormatCtx->streams[videoStream]->r_frame_rate;
stream->avg_frame_rate = stream->r_frame_rate;
stream->time_base = av_inv_q(stream->r_frame_rate);
stream->codec->time_base = stream->time_base;

avformat_write_header(oc, NULL);
}
av_write_frame(oc, &packet);
...
}
}

但是,ffmpeg 说

encoder did not produce proper pts making some up

当代码运行到av_write_frame()时;这里有什么问题?

最佳答案

首先确保 inputStreamFormatCtx 分配并填充正确的值(这是 90% 的解复用/重新复用问题的原因) - 检查互联网上的一些示例以了解您应该如何分配和填充设置其值。

该错误告诉我们发生了什么,看起来这只是一个警告。PTS(呈现时间戳)是一个基于stream->time_base的数字,它告诉我们何时应该显示该数据包的解码帧。当您通过网络获取直播流时,服务器可能没有为数据包的 PTS 设置有效的数字,并且当您收到数据时,它有一个无效的 PTS(您可以通过阅读 packet.pts 并检查它是否为 AV_NOPTS_VALUE)。然后 libav 尝试根据流的帧速率和 time_base 生成正确的 pts。这是一个有用的尝试,如果录制的文件可以以真实的 Action (fps-wise)播放,你应该会很高兴。如果录制的文件将以快 Action 或慢动作(以 fps 为单位)播放,那么您就会遇到问题,并且您不能再依赖 libav 来校正 fps。因此,您应该通过解码数据包来计算正确的 fps,然后根据 stream->time_base 计算正确的 pts,并将其设置为 packet.pts

关于c - ffmpeg录制h264直播流出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30441990/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com