2

我们正在开发一个 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);
        }

.....
}
4

0 回答 0