ofVideoPlayer 버그

안녕하세요. 오랜만에 글을 씁니다.

크로스플랫폼 환경에서 코드를 작성하다가 기이한 증상을 발견하여 공유하고자 합니다.

mp4 (H.264 코덱) 파일을 ofVideoPlayer에 불러와서 비디오의 재생이 끝나면 다른 비디오를 불러오게 하는 코드를 작성했는데
윈도우에서는 잘 되는게, 리눅스/맥에서 안되는 증상을 발견했습니다.
이것때문에 몇시간째 머리싸매고 있었는데 어이없게 getCurrentFrame()의 값이 이상한것을 방금 발견했네요.
파일 시작시에 순간적으로 -값이 나오는걸 보고 알아차렸습니다.

간단히 예를 들면 아래와 같습니다.

ofVideoPlayer player 
player.load("test.mp4");
...
player.update();
if(player.getCurrentFrame() == player.getTotalNumFrames()){
         // 비디오가 끝나면 실행될 블럭
         // 윈도우에서는 잘되는데, macOS 및 linux에서는 동작하지 않습니다.
}

oF문제는 아닌거 같기도하고 코덱문제 같기도 하구요…
일단 영문포럼에 증상을 보고하긴 했습니다.

저처럼 시간날리는 분이 없으시길 바라며ㅠㅠ

OF에서 동영상을 사용하는 작업은 저에게 있어서도 가장 큰 트라우마입니다. ㅎㅎ
예전에 ofVideoPlayer가 QTKit를 사용하던 시절엔 memory leak가 발생하던지 에러로 큰 안건에서 대형 사고가 있었던지라… 그후론 ofVideoPlayer대신 ofAVFoundationVideoPlayer를 사용하려고 노력중입니다. 090부터는 OF개발도 AVFoundation를 베이스로 하는 것으로 알고 있어요. 불편한 것은 ofAVFoundationVideoPlayer는 현재 제가 알기론 알파값이 사용할 수 없는 것 이외에는 사용하는데 큰 문제는 없어 보입니다.
전반적으로 OF에서 동영상을 사용하는 게 가장 힘든 작업인데 이런 것에 관한 여러분의 노하우가 쉐어되면 좋겠네요.

1 Like

ffmpeg를 사용하는 것도 한 방법입니다. 녹화용 애드온이 있는데 재생용도 녹화용 비슷하게 만들 수도 있을 것 같아요.
코드를 작성하는 방법도 있지만 간단히 ffmpeg콘솔 명령어로 동작하도록 하는 것이 쉬운 편입니다. 그런데 그만큼 ffmpeg를 조금은 알아야 하기도 합니다.

알파값이 적용되지 않는 것은 fbo에 그린 후 fbo에 알파를 적용하면 되는 것 아닌가 싶네요. 이미 같은 방법 혹은 비슷한 방법으로 사용하고 계시겠죠?

1 Like

if(player.getCurrentFrame() >= player.getTotalNumFrames()-5)

저는 이런 식으로 작업을 많이 했어요. 그리고 프레임으로 하다보면 과부하가 걸려 느려질 때
값을 뛰어 넘을 때가 종종 있어서 == 연산자는 잘 안사용하는 편이에요.

아니면 player.setLoopState(OF_LOOP_NONE); 로 해놓고
!player.isPlaying() 으로 영상이 다 끝나고 멈춰있는지 확인해보기도 합니다.

파일 시작 시에 순간적으로 -가 나올 때에는
다른 영상이 시작할 때 뒷단에서(영상 안보일 때) play(), update()를 잠시 돌리면서 setPosition(0)이나 setFrame(0)으로 일시 정지 해두기도 합니다!

약간 귀찮은 방법인 것 같긴해요 ㅋㅋ

1 Like

괜찮은 해결책이군요!