Я пытаюсь создать видео с использованием изображений, где изображение имеет наложение текста и значков PNG. Для этого я использую библиотеку javacv.
Конечное выходное видео кажется пиксельным, я не понимаю, что это такое, так как у меня нет знаний в области обработки видео, я новичок в этом.
Я знаю это видео. битрейт и выбор видеокодера являются важными факторами, которые влияют на качество видео, и есть еще много других факторов.
Я предоставляю вам два результата для сравнения: один из них генерируется с использованием javacv и еще один из библиотеки Moviepy
Пожалуйста, посмотрите его в полноэкранном режиме, поскольку проблема, о которой я говорю, выделяется только в полноэкранном режиме, вы увидите танцующие пиксели в видео, сгенерированном javacv, но Python вывод кажется стабильным
https://imgur.com/a/aowNnKg — сгенерирован javacv
https://imgur.com/a/eiLXrbk - Создан Moviepy.
Я использую один и тот же кодировщик в обеих реализациях.
Encoder - libx264
bitrate -
800 Kbps for javacv
500 Kbps for moviepy
frame rate - 24fps for both of them
output video size ->
7MB (javacv)
5MB (Moviepy)
размер вывода, сгенерированного из javacv, больше, чем размер видео, сгенерированного Moviepy.
вот моя конфигурация Java для FFmpegFrameRecorder
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(this.outputPath,
this.screensizeX, this.screensizeY);
if(this.videoCodecName!=null && "libx264".equals(this.videoCodecName)) {
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
}
recorder.setFormat("mp4");
recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420);
recorder.setVideoBitrate(800000);
recorder.setImageWidth(this.screensizeX);
recorder.setFrameRate(24);
а вот конфигурация Python для записи видеофайла
Full_final_clip.write_videofile(
f"{video_folder_path}/{FILE_ID}_INTERMEDIATE.mp4",
codec="libx264",
audio_codec="aac",
temp_audiofile=f"{FILE_ID}_INTER_temp-audio.m4a",
remove_temp=True,
fps=24,
)
как вы можете видеть, я не указываю битрейт в Python, но я проверил, что битрейт конечного вывода составляет около 500 кбит/с, что ниже, чем то, что я указал в Java, но Java генерирует видео качество кажется плохим.
Я также пробовал установить значение crf, но, похоже, оно не оказывает никакого влияния при использовании.
Увеличение битрейта несколько улучшает качество, но за счет размера файла вывод по-прежнему кажется пиксельным.
Кто-нибудь может указать, в чем может быть проблема, и как Python обеспечивает лучшее качество видео, когда обе библиотеки используют ffmpeg на бэкэнде.
Редактировать 1: кроме того, я добавляю код, который используется для создания анимации масштабирования для непрерывных кадров. Как где-то я это читал это может быть причиной дрожания пикселей. Пожалуйста, посмотрите и дайте мне знать, есть ли какие-либо улучшения, которые мы можем сделать, чтобы устранить дрожание пикселей.
private Mat applyZoomEffect(Mat frame, int currentFrame, long effectFrames, int width, int height, String mode, String position, double speed) {
long totalFrames = effectFrames;
double i = currentFrame;
if ("out".equals(mode)) {
i = totalFrames - i;
}
double zoom = 1 + (i * ((0.1 * speed) / totalFrames));
double originalCenterX = width/2.0;
double originalCenterY = height/2.0;
// Resize image
//opencv_imgproc.resize(frame, resizedMat, new Size(newWidth, newHeight));
// Determine crop region based on position
double x = 0, y = 0;
switch (position.toLowerCase()) {
case "center":
// Adjusting for center zoom
x = originalCenterX - originalCenterX * zoom;
y = originalCenterY - originalCenterY * zoom;
x= (width-(width*zoom))/2.0;
y= (height-(height*zoom))/2.0;
break;
}
double[][] rowData = {{zoom, 0, x},{0,zoom,y}};
double[] flatData = flattenArray(rowData);
// Create a DoublePointer from the flattened array
DoublePointer doublePointer = new DoublePointer(flatData);
// Create a Mat object with two rows and three columns
Mat mat = new Mat(2, 3, org.bytedeco.opencv.global.opencv_core.CV_64F); // CV_64F is for double type
// Put the data into the Mat object
mat.data().put(doublePointer);
Mat transformedFrame = new Mat();
opencv_imgproc.warpAffine(frame, transformedFrame, mat, new Size(frame.cols(), frame.rows()),opencv_imgproc.INTER_LANCZOS4,0,new Scalar(0,0,0,0));
return transformedFrame;
}
Подробнее здесь: https://stackoverflow.com/questions/789 ... ated-video
Как устранить дрожание пикселей в видео, сгенерированном javacv ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение