MPEG видео не останавливается с точной отметкой времени

281
ram4sof

Мы используем xuggle API для создания файла MP4 с переменной продолжительностью между изображениями. Ниже приведен пример кода

final com.xuggle.mediatool.IMediaWriter writer = com.xuggle.mediatool.ToolFactory.makeWriter("C:\\Media\\img\\output.mp4"); writer.addVideoStream(0, 0, ICodec.ID.CODEC_ID_MPEG4, 3840, 2060); String[] imgFiles = FileUtil.getFiles("chapter1");// List of image filenames  long nextFrameTime = 0;  for(int i=0;i<imgFiles.length();i++) { String fileName = imgFiles[i]; long delay = ImgUtil.getDelay(fileName); nextFrameTime += (delay * 1000); videoImage = ImageIO.read(new File("C:\\Media\\img\\img\\"+fileName)); writer.encodeVideo(0, videoImage,nextFrameTime, TimeUnit.MICROSECONDS); }  writer.close(); 

Сгенерированное видео воспроизводится без каких-либо проблем и задержек между каждым изображением, как и ожидалось, однако, когда мы приостанавливаем видео, оно кажется приостановленным, но переходит к следующему изображению.

Например, когда мы приостанавливаем видео на 2-й минуте, он переходит к следующему слайду через несколько секунд и не останавливается постоянно.

Можно ли как-нибудь перекодировать видео, используя ffmpeg, чтобы решить эту проблему?

Ниже приводится информация о ffprobe:

> ffprobe output.mp4 -show_entries frame=key_frame,pkt_pts_time -select_streams v -of compact=p=0  key_frame=1|pkt_pts_time=0.000000 key_frame=0|pkt_pts_time=30.039994 key_frame=0|pkt_pts_time=122.095995 key_frame=0|pkt_pts_time=215.875990 key_frame=0|pkt_pts_time=298.108995 key_frame=0|pkt_pts_time=377.050996 key_frame=0|pkt_pts_time=457.769986 key_frame=0|pkt_pts_time=549.354986 key_frame=0|pkt_pts_time=632.162997 key_frame=0|pkt_pts_time=711.653986 key_frame=0|pkt_pts_time=800.103990 key_frame=0|pkt_pts_time=882.286000 key_frame=1|pkt_pts_time=963.317998 key_frame=0|pkt_pts_time=1051.639994 key_frame=0|pkt_pts_time=1134.159991 key_frame=0|pkt_pts_time=1217.589990 key_frame=0|pkt_pts_time=1302.699992 key_frame=0|pkt_pts_time=1382.899992 key_frame=0|pkt_pts_time=1471.059998 key_frame=0|pkt_pts_time=1556.299992 key_frame=0|pkt_pts_time=1635.629999 key_frame=0|pkt_pts_time=1720.739986 key_frame=0|pkt_pts_time=1817.729992 key_frame=0|pkt_pts_time=1902.109987 key_frame=1|pkt_pts_time=1993.459998 key_frame=0|pkt_pts_time=2090.628992 key_frame=0|pkt_pts_time=2174.539986 key_frame=0|pkt_pts_time=2269.279988 key_frame=0|pkt_pts_time=2357.029999 key_frame=0|pkt_pts_time=2452.429999 key_frame=0|pkt_pts_time=2532.179995 key_frame=0|pkt_pts_time=2614.539986 key_frame=0|pkt_pts_time=2690.719997 key_frame=0|pkt_pts_time=2777.419989 key_frame=0|pkt_pts_time=2868.429999 key_frame=0|pkt_pts_time=2961.759991 key_frame=1|pkt_pts_time=3044.649989 key_frame=0|pkt_pts_time=3134.589990 key_frame=0|pkt_pts_time=3220.479988 key_frame=0|pkt_pts_time=3300.079988 key_frame=0|pkt_pts_time=3379.829999 key_frame=0|pkt_pts_time=3457.699992 key_frame=0|pkt_pts_time=3542.619989 key_frame=0|pkt_pts_time=3623.209995 key_frame=0|pkt_pts_time=3720.569986 key_frame=0|pkt_pts_time=3798.439994 key_frame=0|pkt_pts_time=3878.949996 key_frame=0|pkt_pts_time=3968.969986 key_frame=1|pkt_pts_time=4064.179995 
0
Хм, мне интересно, нравится ли вашему плееру пауза только на ключевых кадрах, и поскольку это слайд-шоу из неподвижных изображений, ключевые кадры появляются только при появлении нового изображения. Если это так, вы можете обойти эту проблему, используя проигрыватель, который может приостанавливать работу не на ключевых кадрах, или генерировать видео таким образом, чтобы на одном неподвижном изображении было несколько ключевых кадров. Spiff 5 лет назад 0
Спасибо, что ответили, как я могу сгенерировать видео с более чем одним ключевым кадром для каждого неподвижного изображения, используя ffmpeg? ram4sof 5 лет назад 0
Это похоже на игрока. Попробуйте другого игрока. Какой игрок? Gyan 5 лет назад 0
Проблема сохраняется, когда я загружаю на диск Google и в Windows Media Player, он играет правильно в VLC Player, мое основное требование заключается в том, чтобы играть в Google Drive для общего доступа ram4sof 5 лет назад 0

1 ответ на вопрос

0
ram4sof

Моя проблема решена, я перекодировал с помощью инструмента avcon (потратил много времени на попытки с ffmpeg). Единственная проблема заключается в том, что для 1,50-минутного видео кодирование занимает около 40 минут.

avconv -i output.mp4 -vcodec libx264 -crf 27 -preset veryfast -c:a copy -s 3840x2060 fixed_keyframe_output.mp4 

Похожие вопросы