Vídeo MPEG sem pausa no timestamp preciso

0

Estamos usando a API do xuggle para criar um arquivo MP4 com duração variável entre as imagens. A seguir está o código de amostra

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();

O vídeo gerado é reproduzido sem problemas e os atrasos entre cada imagem são esperados, no entanto, quando pausamos o vídeo, ele aparece em pausa, mas passa para a próxima imagem.

Por exemplo, quando pausamos o vídeo em 2 minutos, ele passa para o próximo slide após alguns segundos e não pausará permanentemente.

Existe alguma maneira eu posso re-codificar o vídeo usando o ffmpeg para corrigir esse problema?

A seguir está a informação do 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
ram4sof
fonte
Hmm, gostaria de saber se o seu jogador gosta de fazer uma pausa nos quadros-chave, e como esta é uma apresentação de slides de imagens estáticas, os quadros-chave só acontecem quando uma nova imagem aparece. Nesse caso, você pode conseguir contornar isso usando um player que pode pausar em quadros não-chave ou gerando o vídeo de forma que haja mais de um quadro-chave por imagem estática.
Spiff
Obrigado por responder, como posso gerar o vídeo com mais de um quadro-chave por imagem estática usando o ffmpeg?
ram4sof
Isso parece ser relacionado ao jogador. Tente outro jogador. Qual jogador?
Gyan
O problema persiste quando eu fazer o upload para o Google Drive e no Windows Media Player, ele joga corretamente no VLC Player, Meu principal requisito é jogar no Google Drive para fins de compartilhamento
ram4sof

Respostas:

0

Meu problema está resolvido, eu recodifiquei com a ferramenta avcon (muito tempo perdido tentando com o ffmpeg). O único problema é que a codificação leva cerca de 40 minutos para o vídeo de 1,5 minuto.

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