当前位置: 首页 > 知识库问答 >
问题:

FFmpeg C Api-减少fps但保持视频持续时间

公孙高轩
2023-03-14

使用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);
        }
    }
}

共有1个答案

锺离辰沛
2023-03-14

看起来您正在解码视频,然后对其重新编码。在解码状态下,没有I/B/P这样的东西。它们都是I帧。这也是您应该放置帧的地方。您必须解码每一帧,但一旦解码,只需不将帧发送到编码器,即可删除不再需要的帧。最后,根本不要触及时基。

 类似资料:
  • 我使用的是bert lstm crf模型,其中bert模型来自https://github.com/huggingface/pytorch-pretrained-BERT/lstm crf模型是我自己编写的。 训练bert-lstm-crf模型25个周期后,训练集、开发集和测试集的性能保持不变,但损失继续减少。我应该在哪里做出改变? 以下是表演: 第25纪元: 第26纪元: 第27纪元: 更多纪元

  • 我想获取正在上传到系统中的音频/视频文件的持续时间。早些时候,我使用了,但我想它不再被维护了,因为没有与此兼容的python 3模块。 还有其他轻量级替代品吗? 如果我想写一些自己的东西来完成它,先决条件是什么?

  • 我正在尝试用FFMPEG录制一段H264视频。 以下是我在FFMPEG中使用的选项: -thread_queue_size 512-framerate 30-f rawvideo-pix_fmt rgb32-video_size 1920x1080-i\.\pipe\pipe_name-vcodec libx264-crf 23-pix_fmt yuv420p-preset超快-r 30“outp

  • 我将录制多个视频,这样我就可以用FFmpeg获得一个视频文件。 我已经找到了几种方法来实现这一点,但我发现的所有方法都不能与每个视频的特定持续时间相一致。 这意味着他们只关注整个视频。 正是,我想要的是将Video1插入到有特定时间的Video2中。在搜索与此相关的几篇文章时,我查看了许多文章说“ffmpeg不可能”。 所以我试图将Video2分成两个视频(如Video2-1、Video2-2)和

  • 问题内容: 我有一个价值,我想得到另一个正好是1个月前的时间。 我知道可以用(想要另一个)进行减法,但这会导致a,而我反过来需要它。 问题答案: 尝试AddDate: 产生: 游乐场:http://play.golang.org/p/QChq02kisT