MediaPlayer class를 이용해서 동영상 play를 하고있는데
seekTo를 이용해서 1초 단위로 앞으로감기 뒤로감기를 구현하고있는데
1초씩 이동이 되질 않네요.
seekTo(mPlayer.getCurrentDuration() + 1000); 로 하고있는데
현 시점+1초로 이동됐다가 다시 1초 전 지점으로 돌아옵니다.
+2초도 먹히질 않고. +3초는 해야 이동되네요.
이와 관련해서 알고계신 팁이 있으시면 공유 부탁드리겠습니다.
키프레임 간격을 1로 하면 동영상 파일이 너무 크다는 문제가 있습니다.
거기서 말하는 '1'은 1초라는게 아니라 1frame 이라는 것일 것입니다.
frame rate 를 확이해 보시고, 그것을 기준으로 계산하셔야 합니다.
가령 frame rate가 15 fps 라면 1초에 15프레임이 들어간다는 것입니다.
그럴 경우 키프레임 간격을 15로 하면 키 프레임이 1초 간격이 되는 것입니다.
위에 제 덧글에 덧붙이자면 키 프레임 간격이 2초라고 1초간격 seek가 되지 않는 다는 것은 아닙니다.
어렵다는 것입니다. 때에 따라선 될수도 있고 안될수도 있다는 것입니다.
동영상에 따라서도 그렇지만,
휴대폰 디바이스에 따라서도 다릅니다.
아무리 키프레임을 많이 넣어도 제대로 seek 가 안되는 경우가 꽤 있습니다, 단말에 따라서요.
그러면 보정 로직을 짜줘야합니다.
동영상 플레이어를 제대로 짜려면 FFMPEG 를 사용해야 될꺼에요.
seek의 경우 미디어 포멧에 따라 다르지만, seek을 할 수 있는 정보가 들어 있는 인덱스 테이블을 기준으로
이동이 됩니다. 따라서 index table이 1초 단위로 지원하지 않으면 ffmpeg로 해도 seek이 제대로 안 됩니다.
또한 seek 시 영상의 Ifream 부터 데이터가 들어가야지 화면이 안깨집니다.
제대로 하려면, i 프레임 간격을 구한 후 seek 한 시간 직전 i 프레임으로 seek을 한 후 원하는 시간까지 화면을 그리지 않고 기다리다.
원하는 시간 부터 화면을 그려 줘야 합니다.
플레이어가 문제가 아니라 동영상에 따라 다릅니다.
동영상은 압축을 위해 키프레임이 존재하는데,
키프레임을 중심으로 상대적으로 계산하여 다음 프레임의 값을 얻을 수 있습니다.
따라서 키프레임의 간격이 1초가 넘으면 1초단위의 seek는 어렵운 것입니다.