android - 使用JavaCV ffmpeg对帧进行两次编码(重复,h264格式)的最快方法?

标签 android ffmpeg h.264 javacv

我想尽可能快地使用 FFmpegFrameRecorder 在具有恒定帧速率的同一输出视频中加入多个具有不同帧速率的视频。我正在考虑复制帧以防我想提高帧速率,并在我需要降低帧速率时跳过帧。我正在使用 JavaCV。

除了两次调用记录(图像)之外,有没有更好的复制帧的方法? (输出总是以 mp4 文件格式存储的 h264)类似于 h264 流中的标志,指示当前帧是上一帧的副本,或者跳过冗余编码的其他内容。

最佳答案

  • FrameGrabber 是一个为您提供音频帧、视频帧、帧率、采样率等的类。您只需使用视频文件的路径作为参数创建此类的实例。
  • 然后,FrameGrabber.grab() 将以与输入视频相同的帧速率为您提供音频帧。如果 FrameGrabber.grab() 返回 null,则这意味着视频已迭代到其最后一帧。
  • 现在您可以设置一个新的grabberObject,将您的第二个视频的路径作为其构造函数的参数并重复步骤2
  • 您可以重复第 3 步,直到您的所有视频都已阅读完毕。
  • 现在录制视频;您可以使用从 FrameGrabber 返回的参数初始化记录器。它的高度、宽度、帧率、采样率都可以精确设置以匹配抓取对象。您还需要设置录像机保存视频的路径。在每个 FrameGrabber.grab() 之后,您需要调用 recorder.record(FrameGrabber.grab())。
  • 现在您将新视频提供给 FrameGrabber(),以下将是质量滞后的原因:

  • a) frameGrabber 需要时间来设置。将分配给采集器的新视频路径的转换/转换不会是瞬时的。这可能需要几秒钟的时间。

    b) 这种过渡/转移到新的视频路径,还必须更改记录器的参数-帧率、采样率、高度和宽度。

    要处理这两个问题,您需要处理在转换/转换到新视频路径后添加的第一帧,作为一种特殊情况。在这里,您将重置 recoderFramerate、SampleRate、Height 和 Width 的属性以匹配新的 frameGrabber 属性。

    此实现应该可以正常工作。

    此外,如果您想提高帧速率,请复制帧,并在需要降低帧速率时跳过帧。这两种都会完全扭曲视频。您永远无法达到视频的原始质量。视频帧和声音的滞后将更加明显。

    关于android - 使用JavaCV ffmpeg对帧进行两次编码(重复,h264格式)的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24244785/

    相关文章:

    java - App Engine 异常,如何在 Android 中捕获

    android - 更改字母间距/字距调整 EditText

    ffmpeg - 像 CODEC_FLAG2_BPYRAMID 这样的 ffmpeg 标志位于哪里?

    ffmpeg 输出比例不适用于帧率

    ffmpeg - 如何通过 ffmpeg 将 .MTS 文件 (AVCHD) 转换为 .mp4,而无需正确重新编码 H264 视频流?

    ios - avassetwriter 是否可以输出到内存

    android - 如何在 xamarin.forms 中添加视频播放器

    android - 在 android 中集成 twitter API 时获取 NetworkOnMainThreadException

    ffmpeg - 如何让ASS字幕中的单词一次出现一个?

    compression - 有损解压总是产生相同的输出吗?