2

サイズ、コーデックなどを同じに保ちながら、JNI 経由で ffmpeg ライブラリを使用してビデオのフレームを編集する Android アプリに取り組んでいます。

出力ビデオのオーディオがビデオと同期しなくなるという問題が発生しています。これは、一部の入力ビデオのフレーム レートが 25.66 fps などの整数でなく、出力が 25 fps になるためだと考えられます。出力コーデックの 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