繁体   English   中英

FFmpeg C Api-降低fps,但保持视频时长

[英]FFmpeg C Api - Reduce fps but maintain video duration

我正在尝试使用FFmpeg C API将输入视频转换为看起来像gif动画的视频-意味着没有音频流和4 / fps的视频流。

我有解码/编码部分工作。 我可以从输出文件中删除音频流,但是无法降低fps。 我可以将输出视频流的time_base更改为4 / fps,但它会增加视频的持续时间-基本上以慢速播放。

我认为我需要先删除多余的帧,然后再将它们写入输出容器。

下面是我读取输入帧,然后将它们写入输出容器的循环。

这是我丢弃多余帧的地方吗? 如何确定要丢弃的帧(I,P,B帧)?

while(av_read_frame(input_container, &decoded_packet)>=0) {

    if (decoded_packet.stream_index == video_stream_index) {
        len = avcodec_decode_video2(input_stream->codec, decoded_frame, &got_frame, &decoded_packet);
        if(len < 0) {
            exit(1);
        }

        if(got_frame) {
            av_init_packet(&encoded_packet);
            encoded_packet.data =  NULL;
            encoded_packet.size =  0;

            if(avcodec_encode_video2(output_stream->codec, &encoded_packet, decoded_frame, &got_frame) < 0) {
                exit(1);
            }
            if(got_frame) {
                if (output_stream->codec->coded_frame->key_frame) {
                    encoded_packet.flags |= AV_PKT_FLAG_KEY;
                }

                encoded_packet.stream_index = output_stream->index;
                encoded_packet.pts = av_rescale_q(current_frame_num, output_stream->codec->time_base, output_stream->time_base);
                encoded_packet.dts = av_rescale_q(current_frame_num, output_stream->codec->time_base, output_stream->time_base);

                if(av_interleaved_write_frame(output_container, &encoded_packet) < 0) {
                    exit(1);
                }
                else {
                    current_frame_num +=1;
                }
            }
            frame_count+=1;
            av_free_packet(&encoded_packet);
        }
    }
}

您似乎正在解码然后重新编码视频。 在解码状态下,没有I / B / P之类的东西。 它们都是我的镜框。 这也是您应该丢帧的地方。 您必须解码每个帧,但是一旦解码,只需不将其发送到编码器即可删除不再需要的帧。 最后,根本不要触摸时基。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM