gpt4 book ai didi

c++ - ffmpeg:transcoding.c 问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:17:31 27 4
gpt4 key购买 nike

我正在研究 C++ 中的 ffmpeg,以查看 ffmpeg 的示例

但我不知道如何解决 transcoding.c 中的这个问题

这是我的问题

enter image description here

这是代码

static int open_output_file(const char *filename)
{

AVCodecContext *dec_ctx, *enc_ctx;
AVCodec *encoder;
AVStream *in_stream, *out_stream;
int ret;
unsigned int i;
ofmt_ctx = NULL;

avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, filename);

if (!ofmt_ctx) {
av_log(NULL, AV_LOG_ERROR, "Could not create output context\n");
return AVERROR_UNKNOWN;
}



for (i = 0; i < ifmt_ctx->nb_streams; i++) {

in_stream = ifmt_ctx->streams[i];
out_stream = avformat_new_stream(ofmt_ctx,NULL);


if (!out_stream) {
av_log(NULL, AV_LOG_ERROR, "Failed allocating output stream\n");
return AVERROR_UNKNOWN;
}


dec_ctx = in_stream->codec;
enc_ctx = out_stream->codec;


printf("codec name : %s \n", avcodec_get_name(enc_ctx->codec_id));



if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO || dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
/* in this example, we choose transcoding to same codec */

encoder = avcodec_find_encoder(dec_ctx->codec_id);

if (!encoder) {
av_log(NULL, AV_LOG_FATAL, "Necessary encoder not found\n");
return AVERROR_INVALIDDATA;
}

/* In this example, we transcode to same properties (picture size,
* sample rate etc.). These properties can be changed for output
* streams easily using filters */
if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {

enc_ctx->height = dec_ctx->height;
enc_ctx->width = dec_ctx->width;



enc_ctx->sample_aspect_ratio = dec_ctx->sample_aspect_ratio;


/* take first format from list of supported formats */
enc_ctx->pix_fmt = encoder->pix_fmts[0];

/* video time_base can be set to whatever is handy and supported by encoder */
enc_ctx->time_base = dec_ctx->time_base;
}

else {
enc_ctx->sample_rate = dec_ctx->sample_rate;
enc_ctx->channel_layout = dec_ctx->channel_layout;
enc_ctx->channels = av_get_channel_layout_nb_channels(enc_ctx->channel_layout);

/* take first format from list of supported formats */
enc_ctx->sample_fmt = encoder->sample_fmts[0];
enc_ctx->time_base.num = 1;
enc_ctx->time_base.den = enc_ctx->sample_rate;
}



/* Third parameter can be used to pass settings to encoder */
ret = avcodec_open2(enc_ctx, encoder, NULL);

if (ret < 0) {
cout << "ret<0" << endl;
av_log(NULL, AV_LOG_ERROR, "Cannot open video encoder for stream #%u\n", i);
return ret;
}
}
else if (dec_ctx->codec_type == AVMEDIA_TYPE_UNKNOWN) {
av_log(NULL, AV_LOG_FATAL, "Elementary stream #%d is of unknown type, cannot proceed\n", i);
return AVERROR_INVALIDDATA;
}

else {
/* if this stream must be remuxed */
ret = avcodec_copy_context(ofmt_ctx->streams[i]->codec,
ifmt_ctx->streams[i]->codec);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Copying stream context failed\n");
return ret;
}
}

if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
enc_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;

}

av_dump_format(ofmt_ctx, 0, filename, 1);

if (!(ofmt_ctx->oformat->flags & AVFMT_NOFILE)) {
ret = avio_open(&ofmt_ctx->pb, filename, AVIO_FLAG_WRITE);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Could not open output file '%s'", filename);
return ret;
}
}
/* init muxer, write output file header */
ret = avformat_write_header(ofmt_ctx, NULL);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Error occurred when opening output file\n");
return ret;
}
return 0;

}

我在 open_output_file 函数中发现了这个问题....

但我无法解决这个问题..

我该如何解决这个问题..

我需要你的帮助。

最佳答案

if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {

之后添加
enc_ctx->qmin = 3;
enc_ctx->qmax = 30;
enc_ctx->qcompress = 1;

它对我有帮助。

关于c++ - ffmpeg:transcoding.c 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31375302/

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