サイズ、コーデックなどを同じに保ちながら、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);
}
.....
}