我希望尽快使用FFmpegFrameRecorder以相同的输出视频以恒定帧速率对具有不同帧速率的多个视频进行加密编码。我想复制帧以防我想提高帧速率,并在需要降低帧速率时跳过帧。我正在使用JavaCV。
除了两次调用记录(图像)之外,还有更好的方法来复制帧吗? (输出始终以h464存储在mp4文件格式中)类似于h264流中的标志,表示当前帧与最后一帧重复,或其他东西以跳过冗余编码。
答案 0 :(得分:0)
FrameGrabber是一个为您提供音频帧,视频帧,帧速率,采样率等的类。您只需要创建此类的实例,并将视频文件的路径作为参数。
然后,FrameGrabber.grab()将以与输入视频相同的帧速率为您提供音频帧。如果FrameGrabber.grab()返回null,那么这意味着视频已经迭代到最后一帧。
现在您可以设置一个新的grabberObject,将第二个视频的路径作为其构造函数的参数并重复步骤2
您可以重复步骤3,直到您的所有视频都已被阅读。
现在录制视频;您可以使用FrameGrabber返回的参数初始化录像机。它的高度,宽度,frameRate,samplerate都可以精确设置以匹配抓取器对象。您还需要设置录像机保存视频的路径。在每个FrameGrabber.grab()之后,你需要调用recorder.record(FrameGrabber.grab())。
现在,您将新视频提供给FrameGrabber(),这将是质量滞后的原因:
a)frameGrabber需要时间来设置。转换/转移到将分配给抓取器的新视频路径将不是即时的。这可能需要几秒钟的时间。
b)这种转换/转换到新的视频路径,还必须改变记录器的参数 - 帧率,采样率,高度和高度。宽度。
要处理这两个问题,您需要处理转换/转换到新视频路径后添加的第一帧,作为一种特殊情况。在这里,您将重置recoderFramerate,SampleRate,Height&的属性。宽度以匹配新的frameGrabber属性。
此实现应该可以正常工作。
此外,如果您想提高帧速率,请复制帧,并在需要降低帧速率时跳过帧。这两个都会完全扭曲视频。您永远无法匹配视频的原始质量。更多的视频帧和声音的滞后显而易见。