
현재 ffmpeg 6.0을 사용하여 h264 원시 스트림을 mp4, flv 또는 rtmp 형식으로 캡슐화하고 있습니다. 비트레이트가 1024kb/s를 초과하면 최종 사진 하단에 모자이크 현상이 나타납니다. ffmpeg에 이미지가 잘리는 버퍼 매개변수 설정이 있을 수 있다고 생각됩니다. 제가 작성한 코드는 아래와 같습니다.
avformat_alloc_output_context2(&m_outputFormatContext, NULL, "flv", m_outputUrl.c_str()); const AVOutputFormat* ofmt = m_outputFormatContext->oformat;
AVStream* outStream = avformat_new_stream(m_outputFormatContext, NULL);
outStream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
outStream->codecpar->codec_id = AV_CODEC_ID_H264;
outStream->codecpar->width = track.width;
outStream->codecpar->height = track.height;
outStream->codecpar->profile = track.profile;
outStream->codecpar->codec_tag = 0;
outStream->codecpar->level = track.level;
if(track.profile<100){
outStream->codecpar->format = AV_PIX_FMT_YUV420P;
}else{
outStream->codecpar->format = AV_PIX_FMT_YUV444P;
}
int spsPpsLen = track.params1.size() + track.params2.size();
outStream->codecpar->extradata_size = spsPpsLen;
outStream->codecpar->extradata = (uint8_t*)av_malloc(spsPpsLen + AV_INPUT_BUFFER_PADDING_SIZE);
memcpy(outStream->codecpar->extradata, track.params1.data(), track.params1.size());
memcpy(outStream->codecpar->extradata+ track.params1.size(), track.params2.data(), track.params2.size());
AVDictionary *formatOpts = NULL;
av_dict_set(&formatOpts, "rw_timeout", "500000", 0);
ret = avio_open2(&m_outputFormatContext->pb, m_outputUrl.c_str() , AVIO_FLAG_WRITE , NULL , &formatOpts);
ret = avformat_write_header(m_outputFormatContext, NULL);
av_interleaved_write_frame(m_outputFormatContext, packet);//write video packet