我们正在开发一个 Android 应用程序,它通过 JNI 使用 ffmpeg 库来编辑视频的帧,同时保持大小、编解码器等相同。
我们遇到了输出视频的音频与视频不同步的问题。我们认为这是因为某些输入视频的帧速率不是整数,例如 25.66 fps,而我们的输出将为 25fps。我们试图更改输出编解码器的 time_base 字段以保持精度,即通过乘以分子和分母,但这会使输出帧速率高得离谱。
有谁知道如何强制 ffmpeg 使用与其读取的完全相同的输出帧速率?我们还没有找到以分数帧速率输出视频的方法。
设置输出编解码器的示例:
c = st->codec;
c->codec_id = codec_id;
c->codec_type = AVMEDIA_TYPE_VIDEO;
c->bit_rate = inputCodecCtx->bit_rate;
c->width = inputCodecCtx->width;
c->height = inputCodecCtx->height;
c->time_base.num = 1000;
c->time_base.den = (int)(fps*1000);//fps of the input video *1000 to keep precision
c->gop_size = inputCodecCtx->gop_size;
c->pix_fmt = inputCodecCtx->pix_fmt;
static int write_video_frame(AVFormatContext *oc, AVStream *st, AVFrame *newpict, double fps)
{
int ret = 0;
AVCodecContext* c = st->codec;
AVPacket pkt;
av_init_packet(&pkt);
if (pkt.pts != AV_NOPTS_VALUE)
{
pkt.pts = av_rescale_q(c->coded_frame->pts, c->time_base, st->time_base);
}
if (pkt.dts != AV_NOPTS_VALUE)
{
pkt.dts = av_rescale_q(c->coded_frame->pts, c->time_base, st->time_base);
}
.....
}