ofVideoPlayer 버그


#1

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

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

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

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

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

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

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


#2

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


#3

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

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


#4

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

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

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

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

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


#5

괜찮은 해결책이군요!