ํ ์ ์๋ ์ผ์ด ์๋ค๋ฉด ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ๋๋ ๋ด ํ ์คํธ์์ HLS๊ฐ ์๋ํ๊ณ ์๋ค๋ ๊ฒ์ ๋งค์ฐ ํ์ ํ๋๋ฐ ๊ฐ์๊ธฐ ์ง๊ธ์ ์๋ํ์ง ์์ต๋๋ค.
์ฌ๊ธฐ์์ CORS ํ๋ก์ ํดํน์ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก CORS๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. WebView IOS ์ฑ์์ CORS ํ๋ก์๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์์ผ๋ฉฐ ๋ ๋๋ง์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
WebGL์์ HLS ๋ ๋๋ง์ ์ป๊ธฐ ์ํด ์ ์ฉํ ์ ์๋ WebGL ์์ ์ฌํญ์ด ์์ต๋๊น? ๋์์ด ๋๋์ง ํ์ธํ๊ธฐ ์ํด ์บ๋ฒ์ค ๋ ๋๋ฌ๋ฅผ ์ฌ์ฉํด ๋ณด๊ฒ ์ต๋๋ค. ๋๋ drawImage๋ฅผ ์ฌ์ฉํ ๋ ํ๋ ์์ ์ป๊ธฐ ์ํด ์บ๋ฒ์ค์ ์ด์ค ๊ทธ๋ฆฌ๊ธฐ์ ๋ํ ์๊ตฌ ์ฌํญ์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ด๊ฒ์ Mp4 ํ์ผ์ ๋ฌธ์ ๊ฐ ์๋๋๋ค.
์์๋ ์ฌ๊ธฐ
ํ๋ ์์ ๋จ์ด๋จ๋ฆฌ๊ธฐ๋ ํ์ง๋ง ์บ๋ฒ์ค ๋ ๋๋ฌ๋ก ์บ๋ฒ์ค์ ๊ทธ๋ฆฌ๊ณ ๋ ๋๋งํฉ๋๋ค. webgl์ ํ์ํ ๊ฒ์ด ์์ต๋๋ค.
์ด๊ฒ์ ์๋ฆ๋ค์์ ๋๋ค. ํ๋ก์๋ HLS ์คํธ๋ฆผ์ผ๋ก kpano ๋ฐ๋ชจ๋ฅผ ์ฝ๊ฐ ์์ ํ์ต๋๋ค.
ํ์ฌ Safari OSX์์๋ ์๋ํ์ง๋ง IOS 9์์๋ ์๋ํ์ง ์์ต๋๋ค. ์ฐจ์ด์ ์ด ๋ฌด์์ธ์ง ์์ญ๋๊น? ๋๋ ์ฌํ๊ฒ๋ webgl ํ๋๊ทธ๋ ๊ทธ๋ค์ด ํ๋ ์ผ์ ๋ํ ์ ๋ฌธ๊ฐ๊ฐ ์๋๋๋ค. IOS9์์๋ ์ฌ์ ํ ๊ฒ์์ ํ๋ ์์ ๋๋ค.
์ด ๋ง์ง๋ง ๋งํฌ๋ ๊ฒ์์ ์ฌ๊ฐํ/์ฌํ๋ฆฌ 9.1.3/mac os x 10.11.6์์๋ง ์ฌ์ด๋์ ๋๋ค.
HLS๋ ๋ฌด์์ ๋๊น?
@makc ์ ๋ง? ์ ๋ OSX 10.10๊ณผ Safari 10์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. Apple์ ์ต๊ทผ ๋ฐฉํด ํ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ค๋ช ํฉ๋๋ค. Safari 10. ์ฐ๋ฆฌ๊ฐ Safari 10์ด๋ผ๋ฉด ์ฐ๋ฆฌ๋ ๋ชจ๋ ์ข์ต๋๋ค.
@mrdoob HLS = ์ ํ ์คํธ๋ฆฌ๋ฐ. ์ฆ, ๋ผ์ด๋ธ ์คํธ๋ฆผ๋ฟ ์๋๋ผ VOD๋ ๊ฐ๋ฅํฉ๋๋ค. ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ์ Terradeck ์ฅ๋น์ ํจ๊ป ํ์ค์ด ๋ ๊ฒ์ ๋๋ค. ์: http://dev.electroteque.org/video/360/hls/ultra_light_flight.m3u8
์ฐจ์ด์ ์ ๋ฌด์์ ๋๊น? ์ฒซ ๋ฒ์งธ ์์์ ๋ช ๊ฐ์ง๋ฅผ ๋ณ๊ฒฝํด ๋ณด์์ต๋๋ค. ๋ ๋ฒ์งธ ์๋ ์์ webgl ํจ์์ ๋๋ค.
๊ทธ๋์ texImage2D๋ HLS๋ฅผ ๋ถ๋ถ์ ์ผ๋ก ๋ ๋๋งํ์ง๋ง IOS์์๋ ์์ง ๋ ๋๋งํ์ง ์์ต๋๋ค. ์๋ง๋ Safari 10์ด ์๋๊ธฐ ๋๋ฌธ์ผ๊น์?
๋ช ๊ฐ์ง ์นํท ๋ฒ๊ทธ ํฐ์ผ์ ๋ํด ๋ณด๊ณ ํ ๊ฒ์ ์ฉ์ํด ์ฃผ์ญ์์ค.
๊ทธ๋ค์ ๊ฐ์ IOS ์ ๋ฐ์ดํธ์์ CORS ํ๋ก์ ํดํน์ ๋ฐฉํดํ์ต๋๋ค. macOS๋ Safari์์๋ CORS ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ์์ ๊ฒ์ผ๋ก ๋ณด๊ณ ๋์์ต๋๋ค.
๋๋ ์ด์ ๊ทธ๋ค์ ๋ฐฉํด ๊ณต์์ ํผํ๋ ๋ฐฉ๋ฒ์ ์์๋ด์ผ ํฉ๋๋ค. IOS์์ ์๋ํ๋ HLS๋ฅผ ์ถ๊ฐ๋ก ํ ์คํธํ๋ ค๋ฉด ํด๋น ์์ ์ ์ํํด์ผ ํฉ๋๋ค. ์ ํ์ด ์ง์ฌ์ผ๋ก ๋ถ์ ๋๋๋ผ ๋ ํ๋ฆฌ๊ฒ ํ๋ค ใ ใ ใ ใ
๋ด๊ฐ OSX ๋ ๋๋ง์ ์ป์ ์ ์๋ค๋ฉด ๊ทธ๊ฒ์ด ์์์ด ๋ ๊ฒ์ ๋๋ค. three.js์์ ๋ฌด์์ด ๋ค๋ฅธ์ง ์์๋ด์ผ๋ง ํฉ๋๊น?
๋๋ ์ฌ์ ํ ๋ฌด์์ด ๋ค๋ฅธ์ง ๋น๊ตํ๊ธฐ ์ํด ์ถ์ ๋ฐฉ๋ฒ์ ์๋ํ๊ณ ์์ต๋๋ค. ๊ทธ ์ฌ์ค์ ์๊ฒ ๋๋ฉด IOS๋ ์๋ํ ์ ์์ต๋๋ค.
์๋ง๋ three.js ๋ด์ ์ถ๊ฐ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ด ๋ ๋๋ง ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๊ฒ์ผ๊น์? ๋๋ ๊ทธ๊ฒ์ ๊ฐ๋ก ์ง๋ฅด์ง ์์ง๋ง ์์ webgl ์์ ์์ three.js๊ฐ ํด๋น equirectangular ์์ ์์ ์ํํ๋ ์์ ์ ๋ณต์ ํ๋ ค๊ณ ํฉ๋๋ค. ์ด์ ๋ํ ์์ ์ ฐ์ด๋ ์ฝ๋๊ฐ ์์ต๋๊น?
์ฌ๊ธฐ์์ three.js๊ฐ ํ๋ ์ผ์ ์์ ํ ๋ณต์ ํ ์ ์๋ ์์ ํจ์๋ฅผ ์ฐพ์์ต๋๋ค. ์ผ๋ถ ๋ณ์๋ ์ธ๊ณ ์์น์ ๊ฐ์ด ์ธ๋ถ์ ์ผ๋ก ์ค์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ์ง์ ๋ณต์ฌํ ์ ์์ต๋๋ค.
๋ฐฉ๊ธ ์ด ๋ฌธ์ ๋๋ ๊ด๋ จ ๋ฌธ์ ๋ฅผ ๊ฒช์์ ์ ์์ต๋๋ค. S3 ๋ฒํท์ h264 mp4 ํ์ผ์ด ์๊ณ blob์ผ๋ก video.src์ ๋ก๋ํ๊ณ ์์ต๋๋ค.
Amazon ์น ๊ธฐ๋ฐ ์ ๋ก๋๋ฅผ ์ฌ์ฉํ์ฌ S3 ๋ฒํท์ ์ ๋ก๋ํ๋ฉด Mobile Safari(iOS 10.0.1)์์ ์ง์ ๋ก๋ํ ๋ ๋์์์ด ์ ๋๋ก ์ฌ์๋์ง๋ง three.js ๋ทฐ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋์์์ ์ฌ์ํ๋ ค๊ณ ํ๋ฉด ๊ฒ์ ํ๋ฉด. ๊ทธ๋ฌ๋ Cyberduck์ผ๋ก S3 ๋ฒํท์ ์ ๋ก๋ํ๋ฉด Mobile Safari์ three.js์์ ์ง์ ์ ๋๋ก ์ฌ์๋ฉ๋๋ค.
Cyberduck์ด ๋ฉํ ๋ฐ์ดํฐ 'Content-Type=video/mp4'๋ฅผ ์ค์ ํ๊ณ AWS ์ ๋ก๋๊ฐ 'Content-Type=application/octet-stream'์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ๋น๋์ค/mp4๋ก ์๋์ผ๋ก ์ค์ ํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํฉ๋๋ค.
์ด์ํ ๋ฌธ์ , ๊ทธ๋ฆฌ๊ณ ๋์๊ฒ ๋ง์ ๋จธ๋ฆฌ๋ฅผ ๊ธ์ ๊ฑฐ๋ฆฌ๋ ๋ฌธ์ ๋ฅผ ์ผ์ผ์ผฐ์ต๋๋ค. ์ด๊ฒ์ด ์ด ํฐ์ผ๊ณผ ๊ฐ์ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ์ธ์ง ์๋๋ฉด ์๋ก ๋ง๋ค์ด์ผ ํ๋์ง ์๋ ค์ฃผ์ญ์์ค.
๊ฐ์ฌ ํด์,
๋์คํด
์ด๊ฒ์ mp4๊ฐ ์๋ mpegts ์กฐ๊ฐ ๋๋ ์กฐ๊ฐ๋ ํ์ผ์์์ ๊ฐ์ด HLS ๋ฉ์ดํธ๋ฅผ ์ํ ๊ฒ์ ๋๋ค. Mp4๋ Safari์ IOS ๋ชจ๋์์ ๊ด์ฐฎ์ต๋๋ค. ๋๋ Cyberduck์์ MIME ์ ํ์ ํ์ธํ๊ณ mpegts๊ฐ ์ ํํ๋ค๊ณ ๋งํฉ๋๋ค.
๋ฌผ๋ก IOS๊ฐ ์๋ ์์ webgl ์์ ์์ ๋์ผํ ์คํธ๋ฆผ์ด ์๋ํฉ๋๋ค. ๊ทํ์ ๋ฌธ์ ๋ ๊ฒ์ ์ ํ๋ ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋์ ๋น์ทํฉ๋๋ค. ๋ ๋๋ง์ด ์ ํ ๋์ง ์์ต๋๋ค.
@danrossi ok ๋ฉ์ ธ์. ๋ด ๋ฌธ์ ์ ๋ํด ํน๋ณํ ์ ํฐ์ผ์ ์์ฑํ๊ฒ ์ต๋๋ค. ๊ฐ์ฌ ํด์.
์ด๊ฒ์ด ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค: www.krpano.com/ios/bugs/ios10-webgl-video-texture-crash/
ํ์ฌ three.js์ ๋ํด ๋์ผํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ตฌํํ๋ ค๊ณ ์๋ํ๊ณ ์์ง๋ง ๊ทธ๋ค์ง ๋ฉ๋ฆฌ ๊ฐ์ง ๋ชปํ๊ณ ์์ต๋๋ค.
@ํ์ด์ฆ์. OSX์ IOS์ ๋ฌธ์ ๋ก ์ฌํ๋ฆฌ ๋ฌธ์ ์ ๋๋ค. Mp4๋ IOS ๋ฐ OSX์์ ์ ์๋ํฉ๋๋ค. ์คํฐ์จ๋ฆฌ์ด์ฑ์ ์์ ํ๊ฒ ์ต๋๋ค.
์ฌ์ ํ ๋ ์ฌ์ด์ ์ฐจ์ด์ ์ ์์๋ผ ์ ์์ต๋๋ค. ์์ webgl ์์ ๋ ์ฌ์ ํ IOS์์ ์๋ํ์ง ์์ง๋ง OSX์์ ์๋ํ๊ฒ ํ๋ ๊ฒ์ ์์์ ๋๋ค.
๋ค๋ฅผ ์ โโ์๋ ์๋ํ๋ ์ ๋ฐฉํ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ์ฐพ์ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
์ถ๊ฐ ์ ๋ณด: http://stackoverflow.com/questions/39123109/rendering-a-video-with-webgl-in-ios-10-beta-7-safari-shows-weird-purpish-co.
์ด๊ฒ์ด ๋ธ๋ผ์ฐ์ ๋ฒ๊ทธ๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ด๋ฌํ WebGL ๋ฒ๊ทธ๋ฅผ ์์ ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๊ฐ์ํ ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ตฌํํด์ผ ํ ์๋ ์์ต๋๋ค.
์บ๋ฒ์ค๋ฅผ ํตํด ํ
์ค์ฒ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฌํ๋ฆฌ์์ ์์์ด ํ์๋์์ต๋๋ค.
๊ทธ๋ฌ๋ iOS์๋ ์ฌ์ ํ CORS ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ Same Origin์์๋ง ์๋ํ์ต๋๋ค.
https://bugs.webkit.org/show_bug.cgi?id=135379
webgl์ ์ ๋ชจ๋ฅด์ง๋ง ๋ค์์ ์ฐธ๊ณ ํด ์ฃผ์ธ์.
https://github.com/NishimuraT/videojs-panorama/commit/bd99200d8831c7ad0d10d742e087953da0f44169
@NishimuraT canavasrender๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ด ๋ฌด์จ ๋ง์ธ์ง ์ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ค์ด๋ ๋ฐฉ๋ฒ์ ์๋ํ๋ค.
๋๋ ๊ทธ๊ฒ์ด ํจ๊ณผ๊ฐ ์๋ค๊ณ ์๊ฐํ์ง๋ง CPU๋ก ์ธํด ์ฌ๊ฐํ ๋๋กญ ํ๋ ์ ๋ฐ ์ฌ์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ผํต๋๋ค. ๋ถ๋ช ํ IOS์์ ๋ ๋์ฉ๋๋ค. Ipad 3๋ ์ด๋ฏธ webgl์ฉ ํ๋ ์์ ์ญ์ ํฉ๋๋ค.
@danrossi ์ ๊ฐ ์กฐ๊ธ ์คํด๋ฅผ
raw webgl๊ณผ shader๋ฅผ ์ฌ์ฉํ๋ elevr ํ๋ก์ ํธ์์๋ ๋์ผํ ๋ฌธ์ ๋ฅผ ํ์ธํ์ต๋๋ค. ๋ด ๋ฐฉ๋ฒ์ ๋ค์ ์๋ํ๋ ค๋ฉด ๊ทธ ํ๋๋ฅผ ํดํนํด์ผํฉ๋๋ค. ๊ฑฐ๊ธฐ์ ๋ฌด์ธ๊ฐ๊ฐ ๋ ๋๋ง ๋ฌธ์ ๋ฅผ ์ผ์ผํค๊ณ three.js์ ๋์ผํ๊ฒ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
๋๋ elevr์์ ๊ทธ๊ฒ์ด ๊นจ์ง๋ ์์ธ์ด ๋๋ ํ ์ค์ฒ๋ฅผ ๋ฐ์ธ๋ฉํ๋ ์๋ ์ง์ฐ๊ธฐ์์ ํ์ธํ์ต๋๋ค.
webGL.gl.bindTexture(webGL.gl.TEXTURE_2D, null);
์ด๊ฒ์ด ์ฃผ์ ์ฒ๋ฆฌ๋๋ฉด ์๋ํ๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ๋ํ ๋ฌธ์ ๋ฅผ ์ผ์ผ์ผฐ์ต๋๋ค. ๋ฌด์์ ์ํ ๊ฒ์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
webGL.gl.pixelStorei(webGL.gl.UNPACK_FLIP_Y_WEBGL, true);
three.js์์ ๊ฐ์ ์ผ์ ํ๋ auto clear ์์ฑ์ด ์์๊น์?
์ ๋ํ ๋ง์ ์ธ๊ธ์ ๋ด ๋๋ค.
state.bindTexture(_gl.TEXTURE_2D, null);
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ด ์ด๋์ ์์์ง ๋ชจ๋ฆ ๋๋ค. ๊ทธ๋ ๊ฒ ํด์ผ ํฉ๋๊น?
์ฝ๋๊ฐ ๋๋ฌด ๋ฏธ์ณ์ ํ ์ค์ฒ ๋๋ก์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ์์ธ์ ์ถ์ ํ ์ ์์ต๋๋ค. ์ด ์ง๊ฐ ๋ฐ์ธ๋ฉ์ ๋ญ๊ฐ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@danrossi ์ ๋๋ก ๋ ๋๋งํ๋ ํ์ด์ง๊ฐ ์์ต๋๊น?
๋ ธ์ด์ฆ ๋ฉ์ดํธ์๊ฒ ์ฃ์กํฉ๋๋ค. AB ํ ์คํธ๋ฅผ ๋ ๋ง์ด ํ์ต๋๋ค. elevr ๋ฐ๋ชจ์๋ ์ฃผ์์ ๋ฌ์์ผ ํ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ์ ๊ฐ ์ธ๊ธํ ๊ฒ ๊ฐ์ต๋๋ค.
_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
https://github.com/mrdoob/three.js/blob/6c7f000734f8579da37fb39e5c2e9e5e2dfb14f8/src/renderers/webgl/WebGLTextures.js#L411
์ด๊ฒ์ด ๋ฌธ์ ์ ์์ธ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ด ์์ผ๋ฉด ์ง๊ฐ์ด ๊ฑฐ๊พธ๋ก๋ฉ๋๋ค. ์ด์ ์๋ํ๋์ง ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋ค๋ฅธ ํ ์คํธ๋ฅผ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
๋ด๊ฐ ์ฐพ์ ๋ ๋ค๋ฅธ ์์ ์์ ๋ FLIP_Y๋ฅผ ์ฃผ์ ์ฒ๋ฆฌํ์ต๋๋ค. ์ง๊ธ ๊ฐ๋ฅํ Webkit ๋ฒ๊ทธ?
flipY์ ๋ํ ์ ์ผํ ์ฐธ์กฐ๋ ์ด๊ฒ์ด์ง๋ง webkit nightly๋ ์ฌ์ ํ ๋ฌธ์ ์ ๋๋ค.
https://bugs.webkit.org/show_bug.cgi?id=162491
ํ๋์จ์ด ๊ฐ์์ด ์ค๋จ๋๋ค๊ณ ๊ฐ์ ํ๋ flipY๋ฅผ ๋นํ์ฑํํ๋ฉด ์๋ํฉ๋๊น?
texture = new THREE.VideoTexture( video );
texture.minFilter = THREE.LinearFilter;
texture.format = THREE.RGBFormat;
texture.magFilter = THREE.LinearFilter;
texture.flipY = false;
http://dev.electroteque.org/threejs/hlsflipy.html
์ง๊ธ ์นํท ๋ฒ๊ทธ์ธ์ง ํ์ธํ๋ ค๊ณ ํฉ๋๋ค. ์ง๊ธ์ ํ ์ค์ฒ๋ฅผ ํ์ ํ์ฌ ์ด๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ด ์ด๋ป๊ฒ ๊ฐ๋ฅํ๊ฐ์?
์ง๊ธ์ ํ ์ค์ฒ๋ฅผ ํ์ ํ์ฌ ์ด๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ด ์ด๋ป๊ฒ ๊ฐ๋ฅํ๊ฐ์?
์ง์ค๋ฉํธ๋ฆฌ uv๋ฅผ ๋ค์ง๊ฑฐ๋ ์ ฐ์ด๋์์ ์ํํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
@makc ์ด๋ป๊ฒ
๋ ๋์๊ฐ ํค๋๋ฅผ ํ๊ธฐ ์ํด์์ ๋๋ค. ์ด FlipY "์์ "์ IOS 9์์ ๋์์ด ๋์ง ์๊ณ ๋ฐฉ๊ธ ํ ์คํธํ์ต๋๋ค.
์ง๊ธ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ์ถ์ ํ๋ ๋ฐ ๋ฉฐ์น ์ด ๊ฑธ๋ ธ์ต๋๋ค.
๊ฒ๋ณด๊ธฐ์๋ Three.JS๊ฐ ์๋๋ผ ๋ชจ๋ ์นํท์ ๋ฌธ์ ์ผ ์ ์์ต๋๋ค. ํ์์ ๊ฐ์ด ์ด๊ฒ์ ๋ํด ๋๋ฌด ์ฃ์กํฉ๋๋ค.
์ ๋ ๊ฑฐ๊ธฐ์ ์ ๊ณ ํ์ด์ https://bugs.webkit.org/show_bug.cgi?id=163866
๋๋ ๊ทธ๊ฒ์ ๋ํด ์ด๋ป๊ฒ ํด์ผํ ์ง ๋ชจ๋ฅด๊ฒ ๋ค.
@makc ๊ฐ uv๋ฅผ ๋ค์ง๋ ๊ฒ์ ํ์ธํ๋ ๊ฒ์ด ๋์์ด ๋ฉ๋๋ค. ์ด๊ฒ์ผ๋ก ์ด๋ป๊ฒ ๋ฐ์ ํฉ๋๊น?
uv.setY (i, 1 - uv.getY (i));
http://dev.electroteque.org/threejs/hls.html
IOS์์๋ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ๋ถ๋ช ํฉ๋๋ค.
@makc. ์ด ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ด ๋ฐ์ ์ ์ํํ๊ณ ์์ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ต๋๋ค. ์ด๊ฒ์ ๋ฐ๋ชจ ์์ค ์ค ํ๋์ ์์์ต๋๋ค.
attribute vec2 vx;varying vec2 tx;void main(){gl_Position=vec4(vx.x*2.0-1.0,1.0-vx.y*2.0,0,1);tx=vx;}
FlipY ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์๋ ์๋ ๋ฐ๋ชจ์์ ๋ฐ๊ฒฌ๋์์ผ๋ฉฐ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์์ ์ํํ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
http://dev.electroteque.org/threejs/webglnoflip.html
์ด๊ฒ์ three.js์ ํตํฉํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด์ญ๋๊น? ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋ซ์ต๋๊น?
๋๋ ์ง๊ธ๋ IOS๋ฅผ ๋๋ฒ๊น ํ๊ณ ์๋ค.
ํฅ๋ฏธ๋กญ๋ค์. ์ด ๊ณ์ฐ์ ์ด ์์ ์ ๋ณต์ ํ๋ ค๊ณ ํ๋ฉด ๋ค์ง๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ฌ์ ํ ์ฌํ๊ฒ ํ์ฅ๋ฉ๋๋ค.
http://dev.electroteque.org/threejs/webglflipped.html
๋ฐ๋ผ์ gl_Position์ ์์น๋ฅผ ์ ์ดํฉ๋๋ค.
gl_Position = vec4(aVertexPosition.x*2.0-1.0,1.0-aVertexPosition.y*2.0,0,1);
์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋ซ์ต๋๊น?
์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ํ๋ ์๋ง๋ค ํ ๋ฒ์ฉ ์คํ๋์ง๋ง ์ ์ฒด๊ฐ ์์๋๊ธฐ ์ง์ ์ ์ง์ค๋ฉํธ๋ฆฌ์์ UV๋ฅผ ๋ค์ง์ต๋๋ค.
@makc๋ ์๋ง๋ ์ฒ์์ ๊ฐ์ ์ค์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ๋ด๊ฐ ๋ง๋ค๋ฉด ์ด uv ๊ฐ์ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ๋ณ์์ด๋ฉฐ ๊ณ์ฐ์ ์ฌ์ฉ๋ฉ๋๊น?
์์ค์์ gl_Position์ ๋ํ ๋ช ๊ฐ์ง ์ฐธ์กฐ๋ฅผ ๋ด ๋๋ค. ์ด๊ฒ ๋ง๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ผ๋ ์ด๋ฐ๊ฒ๋ ์๋ค
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
๊ฐ์ฌ ํด์.
IOS Safari์์ webgl์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ข ๋ฅ์ ํธ๋ฆญ์ ์๋ํ์ฌ ๋ ๋๋งํ ํ๋ ์์ ์ป์ ์ ์๋์ง ํ์ธํ์ผ๋ฉฐ ํ์ฌ๋ก์๋ ๊ฒ์์์ ๋๋ค. MP4๋ ๊ด์ฐฎ์ต๋๋ค.
์ด์ ๋ํ ๋ฆฌ์์ค๊ฐ ๋ง์ง ์์ต๋๋ค. ๋ด ๋ฐ๊ฒฌ ์ฌ๋๋ค๋ ์ฐพ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ btw ์ฉ์ด์ง๋ง VOD๋ ์์ต๋๋ค.
๋๊ตฐ๊ฐ์๊ฒ ๋ช ๊ฐ์ง๋ฅผ ํ ์คํธํ๊ฒ ํ์ต๋๋ค. ๊ทธ๋ค์ FLIPY ์์ ์ฌํญ์ด ํฌํจ๋ ์ด ์์ webgl ์์ ๊ฐ IOS 10์์ ์๋ํ๋ค๊ณ ์๊ฐํ์ง๋ง three.js ๋ฒ์ ์ ์ค์ ๋ก ์ถฉ๋ํ์ง ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ํ ์ค์ฒ๋ฅผ ๋ญํญํ๊ฒ ๋ง๋๋ NEAREST ํํฐ๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์์์ฐจ๋ ธ๊ณ , ๊ทธ๊ฒ์ ๋ณต์ ํ๋ ค๊ณ ์๋ํ์ง๋ง ๊ทธ๋ค์ ๋ํด ๋์ผํ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
๊ทธ๋์ ์ด๋ค ์ค ์ด๋ ๊ฒ๋ ์๋ํ์ง ์์ต๋๋ค
http://dev.electroteque.org/threejs/hls.html
http://dev.electroteque.org/threejs/hls2.html
๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋๋ฅผ ์ํ IOS 9๊ฐ ์๋์ง๋ง
๋งค์ฐ ๋ฌด๊ฒ๊ณ ๊ณ ํต์ค๋ฌ์ด ํ ์คํธ ํ์ ๋ฐ๋ชจ์ ๋ฌธ์ ๋ฅผ ๋ฏธ์ธ ์กฐ์ ํ์ต๋๋ค.
FlipY ํด๊ฒฐ ๋ฐฉ๋ฒ์ OSX 10.11 ๋ฐ macOS, IOS 9 ๋ฐ 10 ๋ชจ๋์์ HLS์ ํ์ํฉ๋๋ค. ์์ webgl ์์ ๋ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์์ ์ํํ๊ธฐ ๋๋ฌธ์ FlipY๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. three.js๋ฅผ ์ฌ์ฉํ๋ฉด ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ๋ค์ง์ด์ผ ํฉ๋๋ค.
IOS 10์ HLS ๋ ๋๋ง์ด ํ์๋์ง๋ง ์ฌ๊ฐํ ์์ ์ํฐํฉํธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ํ๋ ์์ด ์๋์ ๋ฉ์ท์ง๋ง ์๋ฎฌ๋ ์ดํฐ์ ํ๋ ์์ด ๋จ์ด์ง๋ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด์ IOS 10์ผ๋ก ์ ๋ฐ์ดํธํ ์ ์๋ ์ฅ์น๊ฐ ์์ต๋๋ค. IOS 9์๋ ์ ํ ํ์๋์ง ์์ต๋๋ค. ๋ ๋ค mp4 ๋ฐ HLS์ฉ CORS ํ๋ก์๊ฐ ํ์ํฉ๋๋ค.
์๋ฎฌ๋ ์ดํฐ๊ฐ ์๋์ ํ์ธํ ํ IOS 10์์ HLS์ ์ฐ์์ฑ ๋ฌธ์ ์ ๊ด๋ จํ์ฌ ์ด์ ๋ค๋ฅธ ํฐ์ผ์ ์ ๊ณตํด์ผ ํ ์๋ ์์ต๋๋ค.
์๋ฌด๋ Safari๋ฅผ ์ง์ํ์ง ์์ผ๋ ค๋ ๊ฒ์ ๋น์ฐํ์ง๋ง ์ฌ๋๋ค์ Safari๊ฐ ์๋ํด์ผ ํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ค๋ฅธ rgb ํ์ ์ค์ ์ ์ ๊ณตํด์ผ ํ์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ์์ง coiourbars๋ฅผ ์์ฑํ๊ณ rgba๋ ์์์ด ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ฎฌ๋ ์ดํฐ์์. ๋ด Ipad ์ฅ์น๊ฐ ์ง์๋์ง ์๊ธฐ ๋๋ฌธ์ ์ด์ IOS 10์ ์ ๋๋ก ํ ์คํธํ ์ ์์ต๋๋ค. ํ์ธ์ ์ํด IOS 10์ด ์ค์น๋ Iphone์ ๊ฐ์ ธ์ค๋ ค๊ณ ํฉ๋๋ค.
http://dev.electroteque.org/webgl/threejs-hls.html
http://dev.electroteque.org/webgl/threejsrgba-hls.html
http://dev.electroteque.org/webgl/webgl.html
http://dev.electroteque.org/webgl/webglrgba.html
์ด ๋ ๊ฐ์ง ์์ ์ง์คํ์ญ์์ค. RGB ํ๋๊ทธ๋ ์ค์ ์ฅ์น์์ ์ฐจ์ด๊ฐ ์์ผ๋ฉฐ ์๋ฎฌ๋ ์ดํฐ๋ ์๋ชป๋ ์ถ๋ ฅ์ ์์ฑํ์ง๋ง RGBA ํ์์ ์ฌ์ฉํ ๋ ์ ์ฌํ ์ถ๋ ฅ์ ์์ฑํฉ๋๋ค.
FlipY ํด๊ฒฐ ๋ฐฉ๋ฒ์ HLS๊ฐ ์๋ IOS 9/10/OSX Safari์ ํ์ํฉ๋๋ค.
Webkit flakey ๋ฒ๊ทธ๊ฐ three.js ๋ฌธ์ ์ธ์ง ํ์คํ์ง ์์ง๋ง ์ด์ ๋ ๋ฒ์งธ ํฐ์ผ์ด ํ์ํ HLS webGL ๋ ๋๋ง์ผ๋ก ์์ ๋ฌธ์ ๋ฅผ ๋ณต์ ํ ์ ์์์ต๋๋ค.
๋๋ฌด ๋ง์ ์์ฒญ๋ ๊ฒฐํจ๊ณผ ๋ฒ๊ทธ๋ก ์ธํด ์ผ ์คํ ํผ๊ฐ๋์์ต๋๋ค.
๋ฐ๋ผ์ ์ด๋ฌํ HLS webgl ์ถ๋ ฅ์ IOS 9๊ฐ ์๋ IOS 10์์ ๋ถ๋ถ์ ์ผ๋ก๋ง ์๋ํฉ๋๋ค. ๋ง์ ์ฅ์น๊ฐ ํ์ฌ 9์์ ๋ฉ์ถฅ๋๋ค. 9์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํฉ๋๋ค.
http://dev.electroteque.org/webgl/threejs-hls.html
http://dev.electroteque.org/webgl/webgl.html
์๋ ํ์ธ์! ๋๋ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์๊ณ ์์ด. ์ง๊ธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์, ๊ทธ ๋ฐ๋ชจ์ ์์ง๋ง IOS 10์ ์์ ๊ณต๊ฐ ๋ฌธ์ ์ ๊ดํ ๋ ๋ฒ์งธ ํฐ์ผ์ ํ์ธํ์ญ์์ค. Webkit/Apple์ ๋์ ํ์ฌ IOS 9์์ ์๋ํ๋๋ก ํ๋ ๋ ธ๋ ฅ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ฆ, Ipad 3๊ณผ ๊ฐ์ ๊ตฌํ ์ฅ์น๋ ์ ์ธ๋์ง๋ง ์ด์จ๋ ๊ฐ์ ํ 5fps๋ฅผ ๋ ๋๋งํ ์ ์์ต๋๋ค. IOS 10์ด ์๋ํ๋ ค๋ฉด ๋จผ์ ์ง์คํด์ผ ํฉ๋๋ค.
Webkit์ ๋ณด๊ณ ๋ ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ชจ๋ Safari์์ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋๋ค.
http://dev.electroteque.org/webgl/webgl.html ์ด ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ios10์์ ํ์ด์ง๋ฅผ ํ ์คํธํ์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ด์ง๊ฐ ๋ก๋๋ ๋ ์ฌํ๋ฆฌ๊ฐ ์ถฉ๋ํฉ๋๋ค.
threejs ์์ ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
์ด ๋ฌธ์ ์ ๋์ด๋ ๋ชจ๋ ์๋ฅผ ํ ์คํธํ์ต๋๋ค. http://dev.electroteque.org/webgl/webglrgba.html ๋ง ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ๊ณต๊ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
@wuyingfengsui ์ด๊ฒ์ IOS 10 Iphone์์ ์๋ํฉ๋๋ค.
http://dev.electroteque.org/webgl/threejs-hls.html
๋น์ ์ ์๋ง ๋ด๊ฐ ๋ด๊ธฐ ์๋ฎฌ๋ ์ดํฐ๋ฅผ ํ์ธํ๊ณ ์์ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ์์ฒญ๋ ๋ฌธ์ ์ ๋๋ค. ํ๋ ์์ ์ ๋ฐ์ดํธํ์ง ์์ ๋ฟ๋ง ์๋๋ผ ๋ น์ ์ปฌ๋ฌ๋ฐ๋ฅผ ํ์ํฉ๋๋ค. RGBA ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฎฌ๋ ์ดํฐ์์ ์๋ํฉ๋๋ค. ๊ฑฐ๊ธฐ์ ์ด์ํ ๊ทธ๋ํฝ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ ์์ต๋๋ค.
์๋ฎฌ๋ ์ดํฐ์์ RGBA ํ๋๊ทธ์ ๊ฐ์ด RGB ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ ๋ ์ค์ IDevice์์ ์ ๊ณต๊ฐ ๋ฌธ์ ๋ฅผ ๋ณผ ์ ์์ต๋๋ค!
Ipad 3๊ฐ ๊ตฌ์์ด ๋์์ง๋ง ๊ณ ๋ง๊ฒ๋ Iphone์ ์ก์ธ์คํ ์ ์์๊ธฐ ๋๋ฌธ์ ์ง๊ธ์ IOS 10์ ์ ๋๋ก ํ ์คํธํ์ง ๋ชปํ๊ณ ์์ต๋๋ค.
CORS ํ๋ก์ URL๋ ๊ธฐ๋กํด ๋์ญ์์ค.
์์ ๊ณต๊ฐ ๋ฌธ์ ์ ๋ํด์๋ ์ง๊ธ ์ด๊ฒ์ ์ฐธ์กฐํ์ญ์์ค.
https://github.com/mrdoob/three.js/issues/10067
์ด ์นํท ํฐ์ผ์ ๊ทธ๋ค์ด ๊ทธ๊ฒ์ ์์ ํ๊ณ ๋ฆด๋ฆฌ์ค๋ฅผ ๋ฏธ๋ฃจ๋ ๋ฐ ์ ๊ฒฝ์ ์ฐ์ง ์์ ๊ฒ์ ๋๋ค.
ios 10 iphone 7์์ RGB๋ฅผ RGBA๋ก ๋ณ๊ฒฝํ ๋ ์๋ํ๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
์ข์, ๋ค๋ฅธ ์ฅ์น์ ๋ํด ๋ค๋ฅด๋ฏ๋ก ์ข์ ๊ฒ์ ๋๋ค. RGBA๋ก ์ ๋ฐ์ดํธ ํ์ต๋๋ค. ์ด๋ ?
@danrossi ์๋ํฉ๋๋ค.
@wuyingfengsui ๊ทธ๊ฒ์ ๊ดํด ์นํท ํฐ์ผ์ ์ ๋ฐ์ดํธํด์ผ ํฉ๋๋ค. ๋๋ ์๋ง์ด ๋ ๋ค๋ฅธ ์์ ํ๋๊ทธ๊ฐ ์์์ ์ ์ ์์ผ๋ฉฐ ๊ทธ ์ค ํ๋๊ฐ ์ฌ๋ฐ๋ฅธ ๊ฒ์ ๋๋ค. ๋ค๋ฅธ HLS ์คํธ๋ฆผ์ ์๋ํ์ง๋ง ๋์ผํ์ต๋๋ค.
three.js ์์์ ๋ค์ํ ๊ฐ์ด ์์์ ์ ์ ์์ต๋๋ค. ์ฆ ์ด๊ฒ๋ค. ์ฒ๋ฆฌ๋๋ ๋ฐ์ดํธ ์ ํ ํ๋๊ทธ๋ ์์ต๋๋ค. ์ํ ์ฐฉ์ค์ ๋งค์ฐ ํผ๊ณคํ ์ํ ์ฐฉ์ค.
https://github.com/mrdoob/three.js/blob/dev/src/constants.js#L126
๊ทธ๋์ ์ฌํ๊ฒ๋ IOS 9๋ ์ด๊ฒ์ผ๋ก ์์ ํ ์ค๋ณต๋์ด ์๋ํ์ง ์์ต๋๋ค. ์ด์ ์ฅ์น๋ IOS 10์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ค ์ข ๋ฅ์ ๋ฐฉํด ํ์๊ฐ ์งํ๋๊ณ ์๋ค๊ณ ์๊ฐํ๋ฉฐ Safari 10์ด ์ถ์๋๊ธฐ ์ ์ ์๋ํ๋ค๊ณ ์๊ฐํฉ๋๊น? Apple ๋ฐ ๋๋ก๋ Android์์ ๋ชจ๋ ๋ถ์ผ์น๋ก ์ธํด ํ ์คํธ ๋จ๊ณ์ ๋ช ๋ฌ์ด ๊ฑธ๋ ธ์ต๋๋ค. ๋๋ HLS๋ฅผ ํ ์คํธํ์ ๋ ๊ทธ๊ฒ์ด ์๋ํ๊ณ ์๋ค๊ณ ํ์ ํฉ๋๋ค.
๋๋ webGL์ ์ต์ํ์ง ์์ต๋๋ค. ์นํท์ด ํด๊ฒฐ๋ ๋๊น์ง ํด๊ฒฐ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ด webgl์ ํ ์ค์ฒ๋ฅผ ์ ๋ก๋ํ๋ ๊ฒ์ ๋๋ค. ๊ด์ฌ ์๋ ํ๋๊ทธ์ ๋๋ค.
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, video);
@wuyingfengsui macOS์์ CORS ๋ฌธ์ ๋ฅผ ๋ถ๋ถ์ ์ผ๋ก "์์ "ํ๋ ๋ฐ 5๋ ์ด์์ด ๊ฑธ๋ ธ๋ค๋ฉด
๊ทธ๋์ ๋๊ตฐ๊ฐ๋ ๊ฑฐ๊ธฐ์ ์์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์์๋ด์ผ ํ๊ณ ์ฌํ๊ฒ๋ ์ ์์ ์ ๋๋ค.
์์ webgl ์์ ๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ํ๋๊ทธ๊ฐ ์๋ง์ด ๋ ์ ์์ต๋๋ค. ๋๋ ์์๋ฅผ ์ฌ์ฉํ์ฌ three.js๋ฅผ ํตํด ์ํํ๊ณ "ํ์" ๋ฐ "์ ํ" ์์ฑ์ ๋ฐ์ดํธ ํ์์ด๊ณ ํ์์ RGBA๊ฐ ๊ฑฐ์ ์๋ํ์ง ์๋๋ก ํ๋ ๋ฐ ํ์ํ ์์ ํ์์ ๋๋ค.
๋ด์ผ ์๊ฐ์ ํ ์ ํ์ฌ ๊ฐ ํ๋๊ทธ๋ฅผ ์ดํด๋ณด๊ณ ํ๋์ ์กฐํฉ์ด ์๋ํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@danrossi ์ด๋ป๊ฒ
๋๋ ๊ฐ๋ฅํ ๋ชจ๋ ํ๋๊ทธ์ ์๋ฌด ๊ฒ๋ ์๋ง์ผ๋ก ์๋ํ์ต๋๋ค. RGB ๋ฐ RGBA ํ๋๊ทธ๋ง ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋ฐ์ดํธ ์ ํ์ ๋ถํธ๊ฐ ์์ต๋๋ค. ๋ค๋ฅธ ์ต์ ์ ๊ฒ์์ ์บ๋ฒ์ค๋ง โโํ์ํ์ต๋๋ค. ๋ฌด์์ ๋ ํด์ผ ํ ์ง ๋ชจ๋ฅด์ญ๋๊น?
@danrossi ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. Hls.js ๊ฐ MSE๋ก hls ๋น๋์ค๋ฅผ ์ฌ์ํ๋ค๋ ๊ฒ์
@wuyingfengsui ์ด๊ฒ์ ์ด์ IOS์ ๊ธฐ๋ณธ HLS ๋ฌธ์ ์ ๋๋ค. ์์ ์์ ์ฌํญ์ Safari OSX์ ๋ฒ๊ทธ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
Dash ์คํธ๋ฆฌ๋ฐ์ ์ฌ์ฉํ๋ฉด ์ด์ Safari์๋ ํ๋ก์๊ฐ ํด๊ฒฐ๋ ๊ฒฝ์ฐ์๋ CORS ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ด์ฉ๋ฉด macOS์์ ๊ทธ๋ค์ ๊ทธ๊ฒ๋ ๊ณ ์ณค์ต๋๊น?
์์ ์ฝ๋ ์์ ์ ์ฌ์ฉํ์ฌ three.js์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ฒ ์ธ์๋ ์๋ฌด ๊ฒ๋ ํ ์ ์์ต๋๋ค.
๋๋ ์นํท์ ์์ฌํ๊ณ ์ ํ์ด ๊ทธ๊ฒ์ ๊ณ ์น ๊ฒ์ ๋๋ค. ๊ทธ๋์ ์ง๊ธ ์ด ํฐ์ผ์ ๋ชจ๋ ์์ ์ด ์ง์ค๋์ด ์์ต๋๋ค. RGB ํ๋๊ทธ ํญ๋ชฉ์ ์ด์ IOS 10 ๋ ๋๋ง๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. ๊ทธ๊ฒ์ ๊ฐํ IOS 9 ๋ฐ ์ด์ ์ฅ์น๋ ์ฑ์์ ธ ์์ต๋๋ค.
์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? iOS์์ ๊ณ ์ ์์ ๋ ๋๋ง์ผ๋ก ์์ ํ๋ ์ฌ๋์ด ์์ต๋๊น?
์ด ํฐ์ผ์ ์ฐธ์กฐํ์ญ์์ค.
https://github.com/mrdoob/three.js/issues/10067
HLS ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์ธ๋ถ๋ก ์ด๋ํด์ผ ํ๋ three.js์ ๋ค์ด๊ฐ์ง ์์ฌ๋ฉ๋๋ค.
ํด๋น ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
texture = new THREE.VideoTexture( video );
texture.minFilter = THREE.LinearFilter;
texture.format = THREE.RGBAFormat;
texture.magFilter = THREE.LinearFilter;
texture.generateMipmaps = false;
texture.flipY = false;
var geometry = new THREE.SphereBufferGeometry( 500, 64, 44 );
geometry.scale( - 1, 1, 1 );
var uv = geometry.getAttribute('uv');
for (var i = 0; i < uv.count; i++) {
uv.setY (i, 1 - uv.getY (i));
}
webgl ํ๋๊ทธ๋ฅผ ์๋ง์ผ๋ก ๋ง๋ค๊ณ ์ถ๋ค๋ฉด raw webgl ์์ ๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๊ฐ๋ฅํ ๋ชจ๋ ์ต์ ์ ์๋ํ์ง๋ง ์ง๊ธ์ ์๋ฌด ๊ฒ๋ ์๋ํ์ง ์์์ต๋๋ค. ๊ทธ๊ฒ์ ํ๋ฅญํ๊ณ ์ง์ ์ผ๋ก ๋ฐฉํด๋ฅผ ๋ฐ์์ผ๋ฉฐ ์นํท์์ ์๋ต์ด ์์ต๋๋ค.
๊ฐ์ฌ ํด์. HLS ์ธ์ iOS ๋น๋์ค ํ๋๊ทธ๋ก ์คํธ๋ฆฌ๋ฐํ ๋ค๋ฅธ ๋น๋์ค ํ์์ด ์์ต๋๊น? ๋ ๋๋ง ๋ฌธ์ ์์ด H.264๋ฅผ ์คํธ๋ฆฌ๋ฐํ ์ ์์ต๋๊น?
@pedrofranceschi mp4 ๊ด์ฐฎ์ต๋๋ค. IOS์์ ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ 360 ๋น๋์ค๋ฅผ ์ํ ์ต์ ์ ์ฑ์ฐ๋ ๊ฒ์ HLS์ผ ๋ฟ์ ๋๋ค.
์ด ํฐ์ผ๊ณผ ๊ด๋ จ๋ ํ๋ฆฝ ์์ ์ HLS ์คํธ๋ฆผ๊ณผ Safari์๋ง ์ ์ฉํด์ผ ํฉ๋๋ค. ์ด FlipY ์์ ์ IOS 10์ ๊ฐ์ ธ์ฌ ์ ์๋ ๊ตฌํ ์ฅ์น๋ฅผ ์ข ๋ฃํ๋ IOS 9์์ ์๋ํ์ง ์์ต๋๋ค.
ํ ์คํธ์ฉ์ผ๋ก ์ฌ์ฉํ Ipad 3์์๋ HLS ๋ฐ WebGl์ด ์๋ํ์ง ์์ต๋๋ค. ์ต์ ์์ดํฐ์์ ํ ์คํธํด์ผ ํ์ต๋๋ค. IOS 10 ์๋ฎฌ๋ ์ดํฐ๋ ๊ฑฐ์ ์๋ํ์ง ์์๊ณ ๋ค๋ฅธ ๋ฌธ์ ์ ์ ์ฌํ ์์ ์ธ๊ณต๋ฌผ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
์ ์ด๋ IOS 10์์ Iphone์ ๋ํ ์ธ๋ผ์ธ ํ๋๊ทธ๊ฐ ์๋ํ์ผ๋ฉฐ ์ธ๋ผ์ธ ๋น๋์ค ๋ฐ webgl์ด ์ด์ ๊ฐ๋ฅํ์ง๋ง CORS๋ ์ฌ์ ํ ๋ฌธ์ ์ ๋๋ค. CORS๋ macOS์ Safari์์๋ง ์์ ๋ฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋ ๋ค๋ฅธ ๊ณ ์ ์ ์ธ ์นํท ๋ฒ๊ทธ์ด๊ณ ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์์ HLS.JS ์คํธ๋ฆฌ๋ฐ์ด ๊ด์ฐฎ๊ธฐ ๋๋ฌธ์ Safari๋ฅผ ์ง์ ํฉ๋๋ค.
์บ๋ฒ์ค๋ฅผ ์ถ๊ฐํ์ฌ ํด๊ฒฐํ ์ ์๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ํ์ง๋ง iOS 10์์๋ง ์๋ํฉ๋๋ค. ์ด ์ปค๋ฐ์ ๋ณด์ธ์: https://github.com/yanwsh/videojs-panorama/commit/0122b1bbd31093b77ca7f09900afa74e2c537037
๊ทธ๊ฒ์ ๋น ์ด๋ฒคํธ์์ต๋๋ค. drawImage์ ํจ๊ป ์บ๋ฒ์ค ๋ ๋๋ง์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. WebGL์ด ์๋๋๋ค. three.js ์บ๋ฒ์ค ๋ ๋๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. Canvas ๋ ๋๋ฌ๋ IOS์์ ์ ๋ง ์ง์ฆ๋์ ํ๋ ์์ ๋จ์ด๋จ๋ ค ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ๋น์ ์ ํด๊ฒฐ์ฑ ์ ๋๊น?
ํ์ง์ด ๋ณ๋ก ์ข์ง ์์ต๋๋ค. ํ์ง๋ง ์๋ํฉ๋๋ค :)
ํ๋ ์์ ๋จ์ด๋จ๋ฆฌ๋ ๊ฒ์ ํ์ง ๋ฌธ์ ๊ทธ ์ด์์ ๋๋ค. :)
@mrdoob ์บ๋ฒ์ค ๋ ๋๋ฌ๋ฅผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ์๋ํ์ง๋ง ์ด ์์ ์ ์ํํฉ๋๋ค. ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ฉ์ฌ๋ฅผ ํ์ํ๋ ๊ฒ์ ๋๋ค. ํ์ ๋ ์ณ์ง ์๋ค. mp4 ํ์ผ์ ๋ก๋ํ๋ฉด ์ ๋๋ก ํ์๋์ง๋ง ์ฌ์ ํ ๋ฉ์ฌ ์ ์ด ํ์๋ฉ๋๋ค.
์ฌ์ ํ ์ด ์์ ์ ์ํํ๋ ํ๋ ์์ ์ญ์ ํฉ๋๋ค.
@danrossi
@mrdoob ์ด ๋ฌธ์ ๋ Safari์ HLS์ ๊ดํ ๊ฒ์ ๋๋ค. ์ด ๋ชจ๋ ๋ฐ๋ชจ๋ฅผ ์ํํ๋ ๊ฒ์ ์ ๋ง ์ด๋ ต์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๋ช ๊ฐ์ง ์กฐํฉ์ ๋ง๋ค์์ต๋๋ค.
๋๋ ๋ํ Chrome์ด mp4 ahh์ Safari CORS ํ๋ก์ ๋ฒ์ ์ ์ฌ์ฉํ์ง ์๋ ํ ์ง๊ธ mp4 ์ฌ์์ ๊ฑฐ๋ถํ๋ค๋ ์ฌ์ค์ ์์๋์ต๋๋ค.
IOS 10์ HLS ๋ฌธ์ ๋ฅผ ์ผ์์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๊ธฐ๊ดดํ CanvasRenderer ๋ฌธ์ ๊ฐ ์งํ๋๋ ํ. ์ฌ๊ธฐ์ ์กฐํฉ์ด ์์ผ๋ฏ๋ก ์ํํ๋ ์์ ๊ณผ ๊ฐ๋ฅํ ์ด์ํ ํ์ ๊ฐ ์คํ์ ์ ๋ณด์ฌ์ค๋๋ค. ์ฝ๋๋ ๋ชจ๋ ๋์ผํฉ๋๋ค. ํ ์ค์ฒ ์์ ๋ฉ์ฌ ๊ทธ๋ฆฌ๋๊ฐ ์์ต๋๋ค.
์ฌํ๋ฆฌ์ฉ
http://dev.electroteque.org/webgl/webgl-mp4.html
http://dev.electroteque.org/webgl/canvas-hls.html
ํฌ๋กฌ์ฉ
http://dev.electroteque.org/webgl/webgl-webm.html
http://dev.electroteque.org/webgl/canvas-webm.html
@danrossi Safari ๋ฒ์ ๋ iOS 10์์ ์๋ํ์ง ์์ต๋๋คโฆ
์ด๊ฒ์ IOS 10์์ ์๋ํด์ผ ํ์ง๋ง ์์ ์ํฐํฉํธ๊ฐ ํ์๋์ด์ผ ํฉ๋๋ค.
http://dev.electroteque.org/webgl/threejs-hls.html
๋ค๋ฅธ ๊ฒ๋ค์ IOS ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ CanvasRenderer ํ ์คํธ์ ๋๋ค. ์ต์ํ ๋ฐ์คํฌํ ๋ธ๋ผ์ฐ์ ์์๋ ์๋ํด์ผ ํ๊ณ ์๋ํ์ง ์์์ผ ํฉ๋๋ค.
์ด๊ฒ์ ๋ชจ๋ IOS์์ ์๋ํด์ผ ํ์ง๋ง ๋๋ ๊ทธ๊ฒ์ ๋ํด ๋๋ฌด ๊ฑฑ์ ํ์ง ์์ต๋๋ค.
๋๋ CanvasRender ์๋ฃจ์ ์ด IOS๋ฅผ ์ํ ์ข์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ๋ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ง๋ ์์ง๋ง ๊ทธ๊ฒ์ ์ต์ ์ ๋๋ค. ์ฌ์ ํ CORS ํ๋ก์๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ์บ๋ฒ์ค ๊ทธ๋ฆฌ๊ธฐ๋ ํ๋ ์ ์์ค๋ง ๋ฐ์์ํต๋๋ค. Safari OSX๋ threejs-hls.html์์ FlipY ์์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์บ๋ฒ์ค ๋ฐ๋ชจ๋ฅผ ์ ๋ฐ์ดํธํ๋๋ฐ ์ธ๋ถ์์ ๊ทธ๋ฆด ํ์๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ตฌ ํ์์ ์ด์ํ ๋ฌธ์ ๊ฐ ์์ด ์ดํดํ ์ ์์ผ๋ฏ๋ก ๊ทธ๋ฆผ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋ง๋๊ฑฐ๋ ํ์ ํ์ง ์๊ณ ๋ชจ๋ ํ ์ ์ผ๋ก ๊ธฐ์ธ์ด์ ธ ์์ต๋๋ค.
์ผ์ชฝ ์๋จ ์์ญ์ ํด๋ฆญํ๊ณ ๊ถค๋ ์ ์ด๋ก ๋๋๊ทธํ์ญ์์ค.
๋ฉ์ฌ ๋ฌธ์ ๋ ๋ฉ์ฌ ํ์๋ฅผ ์ค์งํ๋ ค๋ฉด MeshBasicMaterial์ "overdraw: 0.5"๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
CanvasRenderer๋ฅผ ์ฌ์ฉํ ๋ ์ฌํ๋ฆฌ์ CORS ํ๋ก์๊ฐ ํ์ํ์ง ์์ต๋๋ค. CanvasRenderer๊ฐ ๋๋ฌด ๋ง์ ํ๋ ์์ ๋จ์ด๋จ๋ฆด ๋ ๋ ์ ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋ค์์ผ๋ก SoftwareRenderer๋ฅผ ์ดํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
http://dev.electroteque.org/webgl/canvas-mp4.html
http://dev.electroteque.org/webgl/canvas-hls.html
CanvasRenderer๋ ๋ช ๋ฐฑํ ํ๋ ์ ์ญ์ ๋ก ์ธํด ๊ฐ๊ฐ์๊ฐ๋ ๊ฒ์ผ๋ก ํ์๋์์ต๋๋ค. ์ ์ผํ ์ตํ์ ์๋จ์ SoftwareRenderer๋ก ๋น๋์ค ํ ์ค์ฒ๋ฅผ ์๋ํ๋ ๊ฒ์ ๋๋ค. ํด๋น ๋ณ๊ฒฝ ์ฌํญ์ ์์ง ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ผ๋ฉฐ ์์ ์ค์ ์ ์ฐพ์ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋จ์ง ๊ฒ์ ์บ๋ฒ์ค์ ๋๋ค.
์์ ๊ฒฐํจ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ๋ชจ๋ ๊ฒ์ด ํ๋๋ค
@andreabadesso ํฐ์ผ ์ค์ ์ด ๋ ๊ฐ ์๋๋ฐ ๋ณํฉํด์ผ ํ ์๋ ์์ต๋๋ค.
OSX์ ๊ฒฝ์ฐ FlipY ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ๊ทธ ๋ถ์พํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. IOS 10์ ๊ฒฝ์ฐ ์์ ํ ๋ค๋ฅธ ๊ฒ์ด ํ์ํฉ๋๋ค.
์บ๋ฒ์ค ๋๋ก์์ ํฐ ์คํจ์ ๋๋ค. ์์์์ ์ ๋๋ก ๋ ๋๋ง๋์ง๋ ์๊ณ ๋ณด์์ด ์๊ณก๋ ๊ฒ ๊ฐ์ต๋๋ค. ํ๋ ์๋ ๋จ์ด์ง๋๋ค.
๋๋ ์ด์ ์ฌ์ ํ ์บ๋ฒ์ค ๋๋ก์์ ์์กดํ๋ "SoftwareRenderer"๋ก ์ด์ ์ํํ๊ณ ์์ต๋๋ค. ์ง๊ธ ๋ด๊ฐ ์ป๋ ๊ฒ์ ๊ฒ์ ์บ๋ฒ์ค๋ฟ์ด๋ฏ๋ก ์๋ฌด ๊ฒ๋ ์์ต๋๋ค. ๋น๋์ค ํ ์ค์ฒ๋ฅผ ์์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ฌธ์๋ ์์ต๋๋ค.
๋ค๋ฅธ ์ต์ ์ด ์์ผ๋ฉฐ webkit์ด ์๋ตํ์ง ์์ผ๋ฉฐ ๊ฐ๋ฅํ ๋ชจ๋ webgl ํ๋๊ทธ๋ฅผ ์๋ํ์ต๋๋ค. ๋์๊ฐ์ ์ธ์ฝ๋ฉ์ ์๋ง์ผ๋ก ๋ง๋ค ์ ์์ง๋ง HLS๋ ์์ mp4 ํ์ผ์์ ํจํค์ง๋ฉ๋๋ค.
ํํธ, ํ์ฌ์ ์ธ ์๋ฃจ์ ์ด ํ์ํ ์ฌ๋์ด ์์ผ๋ฉด .ts ํ์ผ์ ๊ฐ์ํ๊ณ .mp4๋ก ๋ณํํ๊ณ ์น ์์ผ์ ๋ฐฉ์ถํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ mp4(ios10์์ ์๋ํ๋)์ ๋ค์ ์กฐ๊ฐ์ ๋ค์ด๋ก๋ํ ์ ์๋๋ก ํฉ๋๋ค.
https://github.com/Lab21k/node-hls-mp4-ws/
๊ด์ฌ์ด ์๋ ์ฌ๋์ด ์์ผ๋ฉด ์ ์ฒด ์๋ฃจ์ ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
@andreabadesso ์๋ฃจ์ ์ ๋ํ ํด๋ผ์ด์ธํธ ๊ตฌํ์ด ์์ต๋๊น?
๊ทธ๊ฒ์ ๋งค์ฐ ์กฐ์ฌ์ค๋ฝ์ต๋๋ค. CORS ํ๋ก์๊ฐ ํ์ํ ๋ฟ๋ง ์๋๋ผ ์ค์๊ฐ์ผ๋ก FFMPEG๋ฅผ ํต๊ณผํ๋ ค๊ณ ํฉ๋๋ค. O IOS๋ ์น ์์ผ๋ ์ํํฉ๋๊น? ๋๋ ๊ทธ๊ฒ์ด webrtc๋ฅผ ํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
SoftwareRenderer ์ต์ ์ ํตํด ์ฌ์ ํ ์บ๋ฒ์ค ๋๋ก์์ ํตํด ๋น๋์ค ํ ์ค์ฒ๋ฅผ ์ป์ผ๋ ค๋ ์๋๋ ์ข์ง ์์ต๋๋ค. ๋ฐ๋ก ๋ธ๋ ํ๋ ์์ ๋๋ค. ๋ ์ต์ ๋ชจ๋ ๋ง๋ค๋ฅธ ๊ณจ๋ชฉ์ด์์ต๋๋ค. ์ต์ํ SoftwareRenderer๊ฐ ๋น๋์ค ํ ์ค์ฒ์ ํจ๊ป ์๋ํ๋ ๊ฒ์ ์ด๋ฏธ์ง ํ ์ค์ฒ๋ง ํ์๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ, ์ ๋ ์ง๋ ๋ ์์ ๋ฌธ์ ์ ๋ํด ์์
ํด ์์ผ๋ฉฐ ์ ์ฌ์ฉ ์ฌ๋ก์ ์ ํฉํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๋ค. ์ด ์ค๋ ๋๋ ๋งค์ฐ ์ ์ฉํ์ผ๋ฉฐ ๊ธฐ์ฌํ๊ณ ์ถ์ต๋๋ค.
๋ฌธ์ ๋ ๋นจ๊ฐ์๊ณผ ํ๋์ ์์์ด ์๋ก ๋ฐ๋์๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋์ ffmpeg๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ์์์ ๋ฏธ๋ฆฌ ์ ํํ์ต๋๋ค. threejs์์ ์์์ด ๋ค์ ์ ํ๋๋ฉด ๋น๋์ค๊ฐ ์๋ ๋ชจ์์ผ๋ก ๋์๊ฐ๋๋ค.
์ต์ ์ ์๋ฃจ์
์ ์๋์ง๋ง ์๋ํฉ๋๋ค. (IOS 10.2์์ ํ
์คํธ)
@Yralec
์ธ์ฝ๋ฉ ๋ฌธ์ ์ด๊ฑฐ๋ ์ธ์ฝ๋ฉ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
๊ทธ๋ฌ๋ Wowza ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ์ ๋ํด์๋ ๋์์ด๋์ง ์์ต๋๋ค. ๋ผ์ด๋ธ ์ธ์ฝ๋์ ์๋ ๋ฐฉ์์ ์ ์ดํ ์ ์๋ ์ฌ๋์ ์๋ฌด๋ ์์ ๊ฒ์ ๋๋ค. ์๋ง๋ VOD์ฉ.
ํ์ธ์ ์ํ ffmpeg ํ๋๊ทธ๊ฐ ์์ต๋๊น?
์ฌ์ ํ ๋๋์ต๋๋ค. ์ด๊ฒ์ ์ฌ์ ํ โโํ์ํ FlipY ๋ฌธ์ ๋ฅผ ์ ์ธํ๊ณ three.js์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
Webkit์ด ์ ์ด๋ฐ์ง ์ดํดํ ์ ์์ต๋๋ค.
@danrossi
๋ด๊ฐ ์ฌ์ฉํ ๋ช
๋ น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ffmpeg -i in.mp4 -hls_time 10 -hls_list_size 0 -vf "colorchannelmixer=rr=0.0:rb=1.0:bb=0.0:br=1.0,vflip" -pix_fmt yuv420p out.m3u8
๋ณด์๋ค์ํผ ์ถ๋ ฅ์ ๋ค์ง๊ณ ์์ผ๋ฏ๋ก threejs์์ ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค.
์ข์, ๊ทธ๊ฒ์ ๋ํด ๋ฌผ์ด๋ณด๋ ค๊ณ ํ์ด.
ํ๋์๊ณผ ๋ น์์ ๋ฐ๊พธ๋ ์ ฐ์ด๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋ ์ฝ์ง ์์๊น์?
@mrdoob ์ ๋ ์
ฐ์ด๋์ ๋ํ ์ง์์ด ๊ฑฐ์ ์์ผ๋ฏ๋ก ์ ์๊ฒ๋ ๊ทธ๋ ์ง ์์์ต๋๋ค(๋ํ ๊ทธ๊ฒ์ ๋ํด ์๊ฐ์กฐ์ฐจ ํ์ง ์์์ต๋๋ค). ๊ทธ๋ฌ๋ ๋นจ๊ฐ์๊ณผ ํ๋์์ ๋ฐ๊พธ๋ ๊ฒ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์๋ค๋ฉด ๊ฑฐ์ ํ์คํ๊ฒ ๋ ๋์ ์๋ฃจ์
์
๋๋ค.
๋ํ ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ์ด ๋ง์นจ๋ด ์๋ํ ์๋ ์์ต๋๋ค.
@mrdoob ๋ญ๊ฐ ํ๊ณ ์๋ ๊ฒ ๊ฐ์์. ๋ค์ ํ ๋ฒ ์ฃ์กํฉ๋๋ค. ์ด๊ฒ์ ๋ ๋ค๋ฅธ Webkit ๋ฌธ์ ๊ฐ ๋์์ต๋๋ค. FlipY ์์ ์ ์ฌ์ ํ โโํผํ ์ ์์ต๋๋ค.
๋๋ ์ฝ๊ฐ์ ์กฐ์ฌ๋ฅผํ๊ณ ์ด์ ๊ฐ์ ์ฑ๋ ์์ ๊ตํ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ ๋ ์ด์ ์ ฐ์ด๋ ์ ๋ฌธ๊ฐ๊ฐ ์๋๋๋ค.
gl_FragColor = texture2D(u_image, v_texCoord).bgra;
๋ด ์์ webgl ์์ ์์
์ด๊ฒ์์ ์๋ํ๋ ์๋ฃจ์ ์ ์ป๋ ๋ฐฉ๋ฒ์ ์์ง ๋ชจ๋ฆ ๋๋ค.
gl.shaderSource(ps, "precision mediump float;uniform sampler2D sm;varying vec2 tx;void main(){gl_FragColor=texture2D(sm,txt).bgra;}");
๋จ์ํ ๋ณต์ฌํด์ ๋ถ์ฌ๋ฃ๊ธฐ ํ๋ ํ๋ก๊ทธ๋จ ์ค๋ฅ๊ฐ ์์์ต๋๋ค.
์์ ์ด ์ฝ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ ๋๋ง๋๋ ๋ด์ฉ์ด IOS 10์์ ๋ณด์ด๋์ง ํ์ธํ ์ ์์ผ๋ฏ๋ก ์ ฐ์ด๋์์ ๊ต์ฒด๋ ๋นจ๊ฐ์๊ณผ ํ๋ฆผ ์์์ ๋ฐ์ ์์ผ์ผ ํฉ๋๊น?
@Yralec์ IOS10 ์์ ์ ฐ์ด๋์ ์์ ์ฑ๋ ์์ ๋ฐ์ ์ ํ์ธํฉ๋๋ค. ์๋ฎฌ๋ ์ดํฐ์์ ์ด์ํ ์ ์์ด ๋ ๋๋งํ๋ ค๋ฉด ์์ ํ์์ rgba๋ก ๋ณ๊ฒฝํด์ผ ํ์ต๋๋ค.
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, ๋น๋์ค);
@mrdoob ๋ด์ฅ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ์ด ํ ์ค์ฒ ์์ ๋ณ๊ฒฝ์ ์ด๋ป๊ฒ ์ ์ฉํ ์ ์์ต๋๊น?
gl_FragColor=texture2D(sm,txt).bgra;
@mrdoob. ๋ณด์ . ์ด๊ฒ์ ์ฌ๋๋ค์ด ์ฌ์ฉํ๋ ๊ฒ์ผ ์ ์์ต๋๋ค.
gl_FragColor = texture2D( tEquirect, sampleUV )
var equirect_frag = "uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n";
๊ทธ๊ฒ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์ก์ธ์คํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
@danrossi JS์์ ์ด์ ๊ฐ์ ๊ฒ์ ํดํนํ ์ ์์ต๋๋ค.
THREE.ShaderLib[ 'equirect' ].fragmentShader = THREE.ShaderLib[ 'equirect' ].fragmentShader.replace( "texture2D( tEquirect, sampleUV );", "texture2D( tEquirect, sampleUV ).bgra;" );
์ ฐ์ด๋๋ฅผ THREE.ShaderMaterial์ ๋ณต์ฌํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง๋ง ํ ์ค์ฒ๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด์ญ๋๊น?
var equirect_frag = "uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n";
var equirect_vert = "varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n";
var uniforms = {
tEquirect: { value: null },
tFlip: { value: - 1 }
};
var material = new THREE.ShaderMaterial( {
uniforms: uniforms,
vertexShader: equirect_vert,
fragmentShader: equirect_frag
});
๋ค๋ฅธ ๋ฐฉ๋ฒ์ IOS์ HLS ์คํธ๋ฆผ์๋ง ์ ์ฉํด์ผ ํ๋ฏ๋ก ์ ์ฐํ์ง ์์ต๋๋ค.
์ค์ ๋ก ์ด๊ฒ์ ์ฌํ๋ฆฌ์์ ๋ ๋๋ง๋์ง๋ง FlipY ์์ ์ ์ค๋จ๋ฉ๋๋ค. ๊ฑฐ๊พธ๋ก ์ฌ์๋ฉ๋๋ค. ๋ง์์ด ํ๋ค๋ฆฝ๋๋ค. ์ด ๋ชจ๋ ๋ ธ๋ ฅ์ ์ ํ๊ณผ ์นํท ๋๋ถ์ ๋๋ค.
var uniforms = {
tEquirect: { value: texture },
tFlip: { value: - 1 }
};
var material = new THREE.ShaderMaterial( {
uniforms: uniforms,
vertexShader: equirect_vert,
fragmentShader: equirect_frag
});
@WestLangley ํจ์น๊ฐ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์์ด ๊ฑฐ๊พธ๋ก ํ์๋์ด์ผ ํ์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค.
gl_FragColor=texture2D(sm,txt).bgra;
์ด๊ฒ์ [b]lue์ [r]ed๋ฅผ ๊ตํํ๋ ์ฌ๋ฐ๋ฅธ ์ ฐ์ด๋์ ๋๋ค. ๊ธฐ๋ณธ ์์๋ rgba์ด๋ฏ๋ก bgra๋ ์ด๋ฅผ ๊ตํํฉ๋๋ค.
FlipY ์์ ์ค๋จ
์๋ฅผ ๋ค์ด txt -> vec2(txt.x, 1.0 - txt.y)
๋ฐฉ๋ฒ์ ๋ชฐ๋ผ
ํจ์น๊ฐ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์์ด ๊ฑฐ๊พธ๋ก ํ์๋์ด์ผ ํ์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค.
์ด์ฉ๋ฉด ๋น์ ์ ํจ์น๋ฅผ ๋๋ฌด ๋ฆ๊ฒ ์ ์ฉํ๊ณ ์์ต๋๋ค
@makc ๋ด ์์
๋ด threejs ์์ ์ ๊ฒ์๋ UV ์ฝ๋์์ ๋ค์ง๊ธฐ๊ฐ ์๋ฃ๋๋ฉด ์ ฐ์ด๋์์ ํ๋ ์๋ณ๋ก ๋ค์งํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ถํ์ํ ๊ณ์ฐ์ ์ ๊ฑฐ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
์์ webgl ์์ ์์๋ ์ ์ ์ ฐ์ด๋์์ ๋ค์งํ์ต๋๋ค.
attribute vec2 vx;varying vec2 tx;void main(){gl_Position=vec4(vx.x*2.0-1.0,1.0-vx.y*2.0,0,1);tx=vx;}
๊ทธ๋ฐ ๋ค์ ์กฐ๊ฐ ์ ฐ์ด๋์์ ์์ ์ฑ๋์ ๋ฐ์ ์ํต๋๋ค.
precision mediump float;uniform sampler2D sm;varying vec2 tx;void main(){gl_FragColor=texture2D(sm,tx).bgra;}
three.js์์ ๊ทธ๊ฒ์ ๋ณต์ ํ๋ ค๊ณ ํ๋ ๊ฒ์ด ์ง๊ธ ๋ฌธ์ ์ ๋๋ค.
์ฃ์กํฉ๋๋ค. ์๋ํ๋ ๊ฒ ๊ฐ์ง๋ง FlipY ์์ ์ด ์๋ํ์ง ์์ต๋๋ค. bgra๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์์์ต๋๋ค.
var equirect_frag = "uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV ).bgra;\n}\n";
var equirect_vert = "varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n";
var uniforms = {
tEquirect: { value: texture },
tFlip: { value: 1 }
};
var material = new THREE.ShaderMaterial( {
uniforms: uniforms,
vertexShader: equirect_vert,
fragmentShader: equirect_frag
});
๊ธฐ๋ณธ tFlip ๊ฐ์ 1๋ก ๋ณ๊ฒฝํ๋ฉด ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ํ์๋๋ฏ๋ก HLS์ FlipY ๋ฌธ์ ์ ๋ํ ๋ ๋ค๋ฅธ ์์ ์ต์ ์ด ์์ต๋๊น?
tFlip: { value: 1 }
๋น๋์ค๋ ์๋ฎฌ๋ ์ดํฐ์์ ๋ ๋๋ง์ ์ค์งํ๊ธฐ๋ก ๊ฒฐ์ ํ์ง๋ง ์ ์ด๋ ์์ ๋ณํ๊ฐ ๋ณด์ ๋๋ค. ํจ์น๋ฅผ ๋๋ฒ๊น ํ๋ฉด ์ ฐ์ด๋ ์ฝ๋๋ฅผ ํ์คํ ๋์ฒดํ์ง๋ง ํจ์น๋ ์ฌํ๊ฒ๋ ์๋ํ์ง ์์ต๋๋ค.
์์๊ฐ ์๋ ์์ 1๋ง ์ฃผ๋ ๊ฐ์ผ๋ก ๋ค์ง์ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ด Ipad 3๊ณผ ๊ฐ์ ๊ตฌํ ์ฅ์น๋ฅผ ๋ ์ด์ ์ฌ์ฉํ์ง ์๊ฒ ๋ ํ IOS10์ ๋ํ ์ก์ธ์ค ๊ถํ์ ์์์ต๋๋ค. 10.10์์๋ง ์คํ๋๋ ์ํํธ์จ์ด๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ธ๋ถ ๋๋ผ์ด๋ธ์์ ๋ถํ ๋ macOS์์ ์๋ฎฌ๋ ์ดํฐ๋ฅผ ๋ก๋ํด์ผ ํฉ๋๋ค. ์ด ๋ชจ๋ ๋ฐฉํด ํ์์ ํจ๊ป ์ฆ๊ฑฐ์ด ์๊ฐ์ ๋ณด๋ด์ญ์์ค.
ํ๋ ์์ ์ ๋ฐ์ดํธํ๊ณ ์ ๋๋ก ํ์ ํ๋์ง ์ฌ๋ถ๋ ์์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ด ์์ ๊ฐ IOS 10์์ ์๋ํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ง๊ธ ๋น์ฅ ํ ์ ์๋ ์ต์ ์ ๋๋ค. Safari์์๋ ๋ฐ์ ๋ ์์์ด ํ์๋์ด์ผ ํฉ๋๋ค.
์ ฐ์ด๋ ๋จธํฐ๋ฆฌ์ผ์ ์ฌ์ฉํ๋ฉด ์ด๋ฏธ์ง ์ค์ผ์ผ๋ง, ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ๋ง์น๊ณ ์นด๋ฉ๋ผ ํ์ ์ด ๋ค์๊ณผ ๊ฐ์ด ์๋ํ์ง ์๋๋ก ๋ฉ์ถฅ๋๋ค.
camera.position.x = (Math.PI / 2);
์ด ํจ์น๊ฐ ์๋ํ๋๋ก ์๋ํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ์ฌ์ ํ โโ์นด๋ฉ๋ผ ์์น๋ฅผ ์๋ง์ผ๋ก ๋ง๋ค๊ณ ์์ง๋ง ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์์ต๋๋ค. ์คํ ๊ฐ๋ฅํ ์ต์ ์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฐ ์์ผ๋ก ํ๋ฉด ๋ ๋ง์ ๋ฒ๊ทธ๊ฐ ์์ฑ๋ฉ๋๋ค. MeshBasicMaterial์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ๊ฒ ๋ ๋๋งํ์ง ์์ต๋๋ค.
THREE.ShaderLib[ 'equirect' ].fragmentShader = THREE.ShaderLib[ 'equirect' ].fragmentShader.replace( "texture2D( tEquirect, sampleUV );", "texture2D( tEquirect, sampleUV ).bgra;" );
THREE.ShaderLib[ 'equirect'].uniforms.tEquirect = { value: texture };
THREE.ShaderLib[ 'equirect'].uniforms.tFlip = { value: 1 };
var material2 = new THREE.ShaderMaterial( {
uniforms: THREE.ShaderLib[ 'equirect'].uniforms,
vertexShader: THREE.ShaderLib[ 'equirect'].vertexShader,
fragmentShader: THREE.ShaderLib[ 'equirect' ].fragmentShader
});
๊ธฐ๋ณธ ์ฌ๋ฃ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ์๋ํ์ง ์์ต๋๋ค. ์ฆ
THREE.ShaderLib[ 'equirect' ].fragmentShader = THREE.ShaderLib[ 'equirect' ].fragmentShader.replace( "texture2D( tEquirect, sampleUV );", "texture2D( tEquirect, sampleUV ).bgra;" );
var material = new THREE.MeshBasicMaterial( { map : texture } );
๋ด์ฅ ์ ฐ์ด๋๋ฅผ ํดํนํ๋ ๋์ ์ฌ์ฉ์ ์ง์ ์ ฐ์ด๋๋ฅผ ๋ง๋ค ๊ฒ์ ๋๋ค.
์! ๐
const WIDTH = window.innerWidth;
const HEIGHT = window.innerHeight;
var camera = new THREE.PerspectiveCamera( 75, WIDTH / HEIGHT );
var scene = new THREE.Scene();
// geometry
var geometry = new THREE.SphereGeometry( 1, 32, 16 );
// material
var loader = new THREE.TextureLoader();
var texture = loader.load( 'https://threejs.org/examples/textures/2294472375_24a3b8ef46_o.jpg');
// material
var material = new THREE.ShaderMaterial( {
uniforms: {
texture: new THREE.Uniform( texture )
},
vertexShader: [
"varying vec2 vUV;",
"void main() {",
" vUV = vec2( 1.0 - uv.x, uv.y );", // fipY: 1.0 - uv.y
" gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
"}"
].join( "\n" ),
fragmentShader: [
"uniform sampler2D texture;",
"varying vec2 vUV;",
"void main() {",
" gl_FragColor = texture2D( texture, vUV ).bgra;",
"}"
].join( "\n" ),
side: THREE.BackSide
} );
var mesh = new THREE.Mesh( geometry, material );
scene.add( mesh );
var renderer = new THREE.WebGLRenderer();
renderer.setSize( WIDTH, HEIGHT );
document.body.appendChild( renderer.domElement );
function animate( time ) {
requestAnimationFrame( animate );
mesh.rotation.y = time * 0.0001;
renderer.render( scene, camera );
}
animate();
๊ฒ์ ํ๋ฉด๋ง ๋ ๋๋งํ์ง ์์ต๋๋ค.
@danrossi ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์ผํฉ๋๋ค.
var material = new THREE.ShaderMaterial({
uniforms: {
texture: { value: texture }
},
vertexShader: [
"varying vec2 vUV;",
"void main() {",
" vUV = vec2( uv.x, 1.0 - uv.y );",
" gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
"}"
].join("\n"),
fragmentShader: [
"uniform sampler2D texture;",
"varying vec2 vUV;",
"void main() {",
" gl_FragColor = texture2D( texture, vUV ).bgra;",
"}"
].join("\n")
});
์์ ์ ํ ๋ฐ ๋ณ์ ์ด๋ฆ ์ ๋ฐ์ดํธ ๊ธฐ์ต
์ฌ๊ธฐ์์ ๋ ๋๋ง๋ฉ๋๋ค... (Chrome 55, OSX)
์ด ๋ฌธ์ ๋ HLS ์คํธ๋ฆผ๊ณผ Safari, ํนํ IOS๊ฐ ์๋ ๋น๋์ค ํ ์ค์ฒ์ ๊ดํ ๊ฒ์ ๋๋ค.
meshbasic_frag์ ์๋ ๋ฐฉ์๊ณผ ํ ์ค์ฒ๊ฐ ์ ์ฉ๋๋ ๋ฐฉ์์ ์ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ด ๊ทธ๊ฒ์ด ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
equirect_frag ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉ ์ค์ด๊ฑฐ๋ ์ ํ๋์ด ์์ง ์์ต๋๋ค.
gl_FragColor = vec4( outgoingLight, diffuseColor.a );
์ด๊ฒ์ด ๋ด๊ฐ ๋ณด๋ ์ ๋ถ์ ๋๋ค.
meshbasic_frag
๋ฐ equirect_frag
์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ด ์ฝ๋๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๊ณ ์ด๊ฒ์ ๋์ฒดํ์ญ์์ค.
var loader = new THREE.TextureLoader();
var texture = loader.load( 'https://threejs.org/examples/textures/2294472375_24a3b8ef46_o.jpg');
๋ค์๊ณผ ๊ฐ์ด
var video = document.getElementById( 'video' );
var texture = new THREE.VideoTexture( video );
@mrdoob
๋ท๋ฉด์ด ๋ฌธ์ ๋ฅผ ์ผ์ผ์ผฐ์ต๋๋ค. ์ด ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ํ์คํ ์ผ๋ฐ ํ๋ก๊ทธ๋จ๋ณด๋ค ํจ์ฌ ๊นจ๋ํฉ๋๋ค. ์ฐจ์ด์ ์ ๋ฌด์์ ๋๊น?
์ฌ์ฉ์ ์ ์ ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ FlipY ์์ ์ฌํญ์ด ์์ค๋ฉ๋๋ค.
for (var i = 0; i < uv.count; i++) {
uv.setY (i, 1 - uv.getY (i));
}
์ ์ ์ฝ๋๋ฅผ ์ฝ๊ฐ ์์ ํด์ผ ํ๊ณ x๋ ๋ค์งํ๊ณ y๋ ๋ฐ์ ์ด ํ์ํ์ต๋๋ค. ์ ์ ํ์ ์ฌ๋ฆฌ๊ฒ ์ต๋๋ค.
var uniforms = {
texture: { value: texture }
};
var vertexShader = [
"varying vec2 vUV;",
"void main() {",
" vUV = vec2( uv.x, 1.0 - uv.y );", // fipY: 1.0 - uv.y
" gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
"}"
].join( "\n" );
var fragmentShader = [
"uniform sampler2D texture;",
"varying vec2 vUV;",
"void main() {",
" gl_FragColor = texture2D( texture, vUV ).bgra;",
"}"
].join( "\n" );
var material = new THREE.ShaderMaterial( {
uniforms: uniforms,
vertexShader: vertexShader,
fragmentShader: fragmentShader,
//side: THREE.BackSide
});
์ด ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ํ์คํ ์ผ๋ฐ ํ๋ก๊ทธ๋จ๋ณด๋ค ํจ์ฌ ๊นจ๋ํฉ๋๋ค. ์ฐจ์ด์ ์ ๋ฌด์์ ๋๊น?
๋ง๋ฒ! ๐
@mrdoob ๊ฐ์ฌํฉ๋๋ค ์ฑํผ์ธ. ์์์ ๋ํด ๋ฏธ์ํ์ง๋ง ์ด๊ฒ์ ๋ํด Apple์ ๋ค์ ๋น๋ํ์ญ์์ค.
๋ฐ๋ผ์ ์ ๋ฐฉํ ๋น๋์ค์ ๊ฒฝ์ฐ ๋ฐ๋ชจ๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ์ด๋ฅผ ์ฌ์ฉํ์ง ์์์ผ ํฉ๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ด๋ฌํ ๋น๋์ค ํ ์ค์ฒ์๋ MeshBasicMaterial์ด ์ฌ์ฉํ๋ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ด ํ์ํ์ง ์์ต๋๊น? ๋ธ๋ผ์ฐ์ ์ ๋ค์ํ ๋น๋์ค ํ์์์ ํ ์คํธํ๊ฒ ์ต๋๋ค.
๋ซ์๊น?
์ ๋ฐ์ดํธ๋ ๋ฐ๋ชจ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ฐ๋ผ์ ์ ๋ฐฉํ ๋น๋์ค์ ๊ฒฝ์ฐ ๋ฐ๋ชจ๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ์ด๋ฅผ ์ฌ์ฉํ์ง ์์์ผ ํฉ๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ด๋ฌํ ๋น๋์ค ํ ์ค์ฒ์๋ MeshBasicMaterial์ด ์ฌ์ฉํ๋ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ด ํ์ํ์ง ์์ต๋๊น?
๊ธ์, MeshBasicMaterial
๋ ๋ ์ ์ฐํ๊ณ ์ฌ๋๋ค์ ์
ฐ์ด๋๋ฅผ ์์ฑํ ํ์๊ฐ ์์ต๋๋ค. ์ด ํน์ ํ ๊ฒฝ์ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉ์ ์ง์ ์
ฐ์ด๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋ ๊ฐ๋จํ์ ๋ฟ์
๋๋ค.
๋ซ์๊น?
๋ค!
IOS 10์์๋ ์ ์๋ํฉ๋๋ค. ๋จ์ง ํ๋ ์์ด ์๋ฎฌ๋ ์ดํฐ์์ ์ ๋ฐ์ดํธ๋์ง ์๋๋ค๋ ๊ฒ๋ฟ์ ๋๋ค. ํ๋์จ์ด๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค. ๋ค๋ฅธ ํฐ์ผ์ ๋๊ฒ ์ต๋๋ค.
var vertexShader = [
"varying vec2 vUV;",
"void main() {",
" vUV = vec2( uv.x, uv.y );", // fipY: 1.0 - uv.y
" gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
"}"
].join( "\n" );
var fragmentShader = [
"uniform sampler2D texture;",
"varying vec2 vUV;",
"void main() {",
" gl_FragColor = texture2D( texture, vUV );",
"}"
].join( "\n" );
ํ๋ฆฌํผ๋ฅผ ์ฝ๊ฐ ์กฐ์ ํ๋ฉด ๋์ผํ ํ๋ก๊ทธ๋จ์ด webm์ผ๋ก ํฌ๋กฌ์์ ์๋ํฉ๋๋ค.
@mrdoob ์ด ์ ฐ์ด๋๋ ๋น๋์ค ํ ์ค์ฒ๊ฐ ์๋ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ์๋ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ๋ฆฝ ์์ "1.0 - uv.y"๋ Safari์ HLS์๋ง ํ์ํฉ๋๋ค. ์์ ์ฑ๋ ๋ฐ์ ์ HLS๊ฐ ์๋ IOS10์๋ง ํ์ํฉ๋๋ค.
CORS ํ๋ก์๋ฅผ ํฌํจํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฝค ๋ฏธ์น ๋ ์ด์ด.
๋๋ ์ด๊ฒ์ด meshbasicmaterial์์ ์ ๊ณตํ๋ ์ ฐ์ด๋๋ณด๋ค ๋ ๋์ ์ฑ๋ฅ์ ๋ฐํํ๋ค๊ณ ๋ฏฟ์ต๋๋ค. ์ด๊ฒ์ด ๋น๋์ค ํ ์ค์ฒ์ ํ์ค์ด์ด์ผ ํฉ๋๊น? ํ์ ์ ์ ์ ์ฝ๋์ ํจ๊ป ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ
HLS ๋ผ์ด๋ธ ์คํธ๋ฆผ(.m3u8์ด hls.js๋ก ์ฌ์๋จ)์ ํ์ํ๋ three.js๋ก 360vr ํ๋ ์ด์ด๋ฅผ ๋ง๋ค๋ ค๊ณ ํฉ๋๋ค.
webgl์ด ํ์ฑํ๋ Safari osx์์ ์๋ํ์ง๋ง ipad 10.2์์๋ ๋ชจ๋ ์๋๊ฐ ๊ฒ์์ ์บ๋ฒ์ค์์ ๊ธธ์ ์์ต๋๋ค(์ฌ์ด๋๊ฐ ์๋ํจ)
vr360 ๋ชจ๋๋ฅผ ๋นํ์ฑํํ๋ฉด ๋น๋์ค ์คํธ๋ฆผ์ด ๋ชจ๋ ์ฅ์น์์ ์ ๋๋ก ์๋ํฉ๋๋ค.
์ ์๋ ๋ฐฉ๋ฒ ์ค ์ผ๋ถ๋ฅผ ์๋ํ์ง๋ง ์ฌ์ ํ ๊ฒ์์ ์บ๋ฒ์ค ๋ ๋๋ง์ด ์์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋ ์ฌ๋์ด ์์ต๋๊น?
FlipY ๋ฐ ์์ ์ฑ๋ ๋ฐ์ ์์ ์ฌํญ์ ์ด ์ค๋ ๋์ ์์ต๋๋ค.
๋ด๊ฐ ์ถ์ ํ Webkit ๋ฒ๊ทธ๋ ์ค๋๋์๊ณ ๊ฒฐ๊ตญ ๊ทธ๊ฒ์ ๋ํด ์ฝ๊ฐ์ ์ค๋งํจ์ ๊ทน๋ณตํ์ต๋๋ค. ์์ง ์ด๋ ค ์์ง๋ง ์๋ฌด๋ ๊ทธ๋ค์ ์ณ๋ค๋ณด์ง ์์ ๊ฒ์ ๋๋ค.
Safari์ฉ FlipY ์์ ์ด ํ์ํฉ๋๋ค. ๋ฐ๋ผ์ three.js ํ ์ค์ฒ์์ ์ฌ์ ํ ๋นํ์ฑํํ์ญ์์ค.
๋ค์์ ๋ด ํ๋ ์ด์ด ์๋ฃจ์ ์ ์ํด ๊ณ ์ํ ๊ณต์์ ์ธ es6 ๋ฐฉ๋ฒ์ ๋๋ค. ๋๋์ด ์ฐ๋ ๊ธฐ๋ฅผ ์ฌ๋ฅ ํ ํ์๋ ๋ช ๋ฌ ๋์ ์ฌ์ ํ ์ ๋ชฝ์ ๊พธ๊ณ ์์ต๋๋ค.
shadermaterial ์๋ฃจ์ ์ ์ ์ํ mrdoob ์ฑํผ์ธ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ง๊ธ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ์ด๊ฒ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ํ ์์ฑ๋๋ ๊ฒ๋ณด๋ค ๋ ๊ฐ๋จํ ์ ฐ์ด๋์ ๋๋ค. ๊ทธ๊ฒ์ ๋จ์ง ๋น๋์ค ํ ์ค์ฒ๋ฅผ ์ํ ๊ฒ์ ๋๋ค.
static getVertexShader(unflipY) {
return [
"varying vec2 vUV;",
"void main() {",
" vUV = vec2( uv.x, " + (unflipY ? "1.0 - uv.y" : "uv.y") + ");", // fipY: 1.0 - uv.y
" gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
"}"
].join( "\n" );
}
static getFragmentShader(invertColour) {
return [
"uniform sampler2D texture;",
"varying vec2 vUV;",
"void main() {",
" gl_FragColor = texture2D( texture, vUV )" + (invertColour ? ".bgra" : "") + ";",
"}"
].join( "\n" );
}
static createShaderMaterial(texture, unflipY, invertColour) {
texture.flipY = !unflipY;
if (invertColour) {
texture.format = THREE.RGBAFormat;
}
return new THREE.ShaderMaterial( {
uniforms: { texture: { value: texture } },
vertexShader: WebVRUtils.getVertexShader(unflipY),
fragmentShader: WebVRUtils.getFragmentShader(invertColour)
});
}
์ฉ๋ฒ
let invertColour = false;
if (WebVRUtils.isSafari) {
this.hasHLS = hasHls;
invertColour = hasHls && WebVRUtils.isIpad;
}
this.material = WebVRUtils.createShaderMaterial(this.texture, this.hasHLS, invertColour);
ok three.js์ _gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, texture.flipY) ์ค์ ๋ํ ์ฃผ์์ Safari(10.0.2, ์ด์ ๋ฒ์ ์์๋ ๊ฐ๋ฐ ๋๊ตฌ์์ webgl๋ง ํ์ฑํํ๋ ๊ฒ์ด ํ์ํ์ต๋๋ค. ์ต์
์ ์ง๊ธ ์ฌ์ฉํ ์ ์์) ํ์ง๋ง ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์๋ iPad ๋ฐ iPhone(๋ด ๋์)
shaderMaterial ์๋ฃจ์
์ ๋ํด ๋ด ์ฝ๋์ ์ ํํ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค...
๋น์ ์ ์ง์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค
๋ด ํ ์คํธ์์ FlipY ๋นํ์ฑํ๋ MacOs Safari 10์๋ ํ์ํ์ต๋๋ค.
์(์ด์ 9.xx ๋ฒ์ ์ ์ธ)
ํ์ง๋ง ์๋ฃจ์
์ด ๋ด ์๋ฃจ์
์ด ์๋๋๋ก ๋ชจ๋ฐ์ผ ์ฅ์น์์ ํ๋ ์ด์ด๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.-(
IOS์์๋ FlipY ์์ ๊ณผ ์์ ์ฑ๋ ๋ฐ์ ์ด ๋ชจ๋ ํ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ IOS 10์๋ง ํด๋น๋ฉ๋๋ค. IOS 9์์๋ ์ข์ง ์์ต๋๋ค. ์ด๋ก ์ธํด ๋ง์ ๊ตฌํ ์ฅ์น๊ฐ ์ ์ธ๋ฉ๋๋ค. Apple์ด ๋ด Ipad 3์ฒ๋ผ ๊ทธ๊ฒ๋ค์ ํ๊ฐ์ ํํ๊ธฐ ๋๋ฌธ์ ๋๋ค. IOS 10์ ์ธ๋ผ์ธ ์ฌ์์ ์ง์ํ๋ฏ๋ก ์ด์จ๋ ๋ฐ๋์งํ ๊ฒ์ ๋๋ค.
์ง๊ธ iOS์์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ณ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ๋๊ธ์ด ์ข ํท๊ฐ๋ฆฌ๋ค์.
HLS ๋น๋์ค์ ๊ฒฝ์ฐ:
์ด ์ฌ๋ฐ๋ฅธ์ง?
๋ต์ ์์ ํฐ์ผ์ ์์ต๋๋ค.
์ฌ๋ฌ๋ถ์๊ฒ ๊ฒฝ๊ณ ํ๋ฏ์ด, ๋ถ๋ช ํ ์ต์ iOS 10.3.3 ์ ๋ฐ์ดํธ๊ฐ bgr ๋ฌธ์ ๋ฅผ ์์ ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ...
์์๋๋ก. ๊ฝค ํ์ค. ์ถฉ๊ณ ๊ณ ๋ง์ต๋๋ค.
๊ทธ๋ค์ ์ณ์ ์ผ์ ํด์ผ ํ๊ณ ๋ด๊ฐ ๋ง๋ ํฐ์ผ์ ์ ๋ฐ์ดํธํด์ผ ํ๊ณ ๋ฏธ๊ฐ๋ด ์ํ๋ก ๋จ๊ฒจ๋์์ต๋๋ค. ์์ ์ฌํญ์ด ์๋ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฐ๋ฐ์๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ๊ทธ๋ค์ ์์ง ~ํ์ง ๋ชปํ๋ค. ์ด์ ๋ง์ด๋ ๋ฒ์ ์ ํ์ธํด์ผ ํฉ๋๊น?
IOS 11์๋ CORS ์์ ์ฌํญ์ด ์์ด์ผ ํ์ง๋ง ์์ง ์์ต๋๋ค.
xcode 9 ๋ฒ ํ๋ฅผ ์ป์ ์ ์์์ต๋๋ค. ๊ทธ๊ฒ์ 10.3.3 ์๋ฎฌ๋ ์ดํฐ 10.3.1 ๋ฐ 11๊ณผ ํจ๊ป ์ ๊ณต๋์ง ์์ต๋๋ค. 11์์ ํ ์คํธํ๋๋ฐ ๋ฐ์ ๋ rgba๊ฐ ์ฌ์ ํ ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ น์ ๋์คํ๋ ์ด๊ฐ ํ์๋๊ฑฐ๋ ์ ํ ํ์๋์ง ์์ต๋๋ค. ์์ ์ ๋นํ์ฑํํ์ฌ ๋ ๋ง์ ํ ์คํธ๋ฅผ ์คํํด์ผ ํฉ๋๋ค.
IOS11 ์๋ฎฌ๋ ์ดํฐ๋ ์๋ง์ ๋๋ค. 10.3.3 IOS ์๋ฎฌ๋ ์ดํฐ๊ฐ ์์ต๋๋ค. IOS11์๋ CORS๊ฐ ์์ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด์ iOS 11์ด ๋์ค์๊ฒ ๊ณต๊ฐ๋์์ผ๋ฏ๋ก ๋ช ๊ฐ์ง ํ ์คํธ๋ฅผ ์คํํ์ผ๋ฉฐ iPhone iOS 11(์์ง iPad๋ฅผ ์ฌ์ฉํ์ง ์์)์ ๋ํ ์ด ์ค๋ ๋์ ์์ ์ฌํญ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
HLS๊ฐ ์๋ iPhone ๋ฐ iPad์ iOS 10.3.3์์ CORS ํต, FlipY ๋ฐ ์์ ์์ ์ ์ฌ์ฉํ์ฌ ์๋ํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
iPhone iOS 11์๋ HLS๊ฐ ์๋ ๊ฒ์์ ํ๋ฉด์ด ์์ต๋๋ค(CORS ํต, FlipY ๋ฐ ์์ ์์ ์ฌ์ฉ). ์์ ํด์ผ ํ ๊ฒ์ด ๋ ์๋ค๊ณ ์๊ฐํ์ง๋ง ์์ง๊น์ง๋ ์๊ฐ๋ฝ์ ๋์ง ์์์ต๋๋ค.
CORS ๋ฌธ์ ์ ๊ด๋ จํ์ฌ iOS 11์์๋ ์ต์ํ MP4 ์ ์ง์ ๋ค์ด๋ก๋์ ๋ํด ๊ฐ์ ๋ ๊ฒ์ผ๋ก ๋ณด์ด์ง๋ง ์์ ์ด์ ๋ก HLS์ ๋ํด ํ์ธํ ์ ์์ต๋๋ค.
๋๊ตฐ๊ฐ๊ฐ ๋ ์ด์ด ์ข๋ค๋ฉด ์ ๋ฐ์ดํธํ์ญ์์ค :/
IOS11๋ ๋ฐ์ ์ ์๋ ์๋ก์ด ipad๋ฅผ ์ป๊ธฐ ์ํด ์ต์ ์ ๋คํ๊ณ ์์ต๋๋ค.
์๋ฎฌ๋ ์ดํฐ์๋ ์์ ์ฌํญ์ด ์์ผ๋ฏ๋ก ์คํจํ์ต๋๋ค.
๊ฑฐ๊ธฐ์์ ์นด์ดํฐ ํดํน์ ํด์ผ ํ๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ๋๋ rgb ์์ ์ฑ๋์ ๋ค์ ์ ํํ ์ ์๋ ๊ฒฝ์ฐ.
HLS์ ๊ฒ์์ ๋ ๋๋ง์ ์ข์ ์์์ด ์๋๋ฉฐ ํ๊ท๋ฅผ ๋๋๋ฆฌ๋ ๋ฐ ๋ช ๋ ์ด ๊ฑธ๋ฆฌ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉํด ํ์์ ๋๋ค. ๊ทธ๊ฒ์ด IOS9์์ ์ผ์ด๋๋ ์ผ์ ๋๋ค.
CORS๋ IOS11์์ ์์ ๋์ด์ผ ํ๋ฉฐ ํ๋ก์๊ฐ ํ์ํ์ง ์์ต๋๋ค.
@danrossi ์ ๋ ํ์ฌ iOS 11์์ ์ด ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค. ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์. iOS 10์ ์ฌ์ ํ โโCORS ์์ ๋ฐ Flip Y๋ก ์ ๋๋ก ์๋ํ์ง๋ง iOS 11์ ์ค๋์ค๋ง ์ฌ์ํฉ๋๋ค.
IOS11์ด ์ค์น๋ ์ ipad๋ฅผ ๊ตฌ์ ํด์ผ ํฉ๋๋ค. HLS๊ฐ IOS11 ๋ฒ ํ ์๋ฎฌ๋ ์ดํฐ์์ ์๋ํ๊ณ ์์ต๋๊น? CORS์ ๊ด๋ จ๋ ๊ฒ์ผ ์ ์์ต๋๋ค. rgb ์ฑ๋ ํ๋ฆฝ์ ๋ฐ์ ๋ ์์์ ํ์ํฉ๋๋ค. ๊ทธ๋์ ๊ฒ์์์ CORS์ ๊ด๋ จ์ด ์์ ์ ์์ต๋๊น?
CORS ํ๋ก์ ์์ด ์๋ํ์ง๋ง ์ฌ์ ํ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋๋ ๋ํ ๊ทธ๊ฒ์ ์ํด Flip Y ์์ด ์๋ํ์ง๋ง ์๋ฌด ๊ฒ๋ ๋ฐ๋์ง ์์์ต๋๋ค. ์๋ฆฌ๋ง ์๊ณ ์์์ ์์ต๋๋ค :/
ios11 ์ฅ์น์์ ์ฌ์ ํ ๋์ผํ ๋ฌธ์ ๊ฐ ์๊ณ ์๋ฆฌ๋ง ์๊ณ ๋น๋์ค๊ฐ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ฌ๋์ด ์์ต๋๊น?
๋น๋์ค๋ฅผ 2D ์บ๋ฒ์ค์ ๊ทธ๋ฆฌ๊ณ ํด๋น 2D ์บ๋ฒ์ค๋ฅผ webgl์ ํ ์ค์ฒ๋ก ์ฌ์ฉํ์ฌ ์๋ํ๋๋ก ํ์ต๋๋ค.
ios11์์ 2D ์บ๋ฒ์ค ํ ์ค์ฒ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์ฝ๋๋ฅผ ๊ฒ์ํ ์ ์์ต๋๊น?
๊ทธ๊ฒ์ ์์ฃผ ๋์ ์๊ฐ์ ๋๋ค. ์บ๋ฒ์ค ๋๋ก์์ ํ๋ก์ธ์๋ฅผ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
์ด ๋ฌธ์ ์ ๊ด๋ จํ์ฌ ์นํท ํฐ์ผ์ ์ ๋ฐ์ดํธํ์ต๋๋ค. ๊ทธ๋ค์ ๊ทธ๊ฒ์ ์ ํ ๋ค๋ฃจ์ง ์์์ต๋๋ค. ํ ์ ฐ์ด๋์ ์์ค ์ฝ๋๋ก ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๊ธฐ๋ ํ์ต๋๋ค. ๋น์ ์ด ์ฃผ์ฅํ๋ ๊ฒ์ ์ง๊ธ ์๋ํ์ง ์์ต๋๋ค.
๋ค๋ฅธ ์ฌ๋์ด ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ์ ์ฅ์น๋ฅผ ์ป์ ๋๊น์ง ์์ง ์ ๋๋ก ํ ์คํธํ ์ ์์ต๋๋ค. ์๋ฎฌ๋ ์ดํฐ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ํ๊ณ ์์ต๋๋ค. Iphone 5์กฐ์ฐจ๋ IOS 11์ ์ป์ ์ ์๋ ๊ณํ๋ ๋ ธํํ์ ์ง๋ฉดํ์ต๋๋ค.
์ฌ๊ธฐ ํฐ์ผ์ด ๋ ์์ต๋๋ค. https://bugs.webkit.org/show_bug.cgi?id=163866#c17
@LoveLetterIloveU๋ ์ฌ๊ธฐ ๋ด ์ํ ์ฝ๋์
๋๋ค: https://htmlvideocanvas-sibabi.c9users.io/hello-world.html (ios์์๋ง ์ด๊ธฐ)
@danrossi ๊ฐ ๋ง์ต๋๋ค. ์ต์์ ์๋ฃจ์
์ ์๋๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํฌ์ธํฐ๋ฅผ ๋ฐ์ธ๋ฉํ๋ ๋์ ๋ฐ์ดํธ ๋ฐฐ์ด์ memcopy๋ฅผ ์ํํฉ๋๋ค. ๊ทธ๋ฌ๋ Apple์ด ํ๋ก์ ํธ๋ฅผ ์ ์ง ๊ด๋ฆฌํ๋ ๋์ ์์
์ ์ํํฉ๋๋ค. ๋๋ ์ฌ์ ํ ์ด ์ ๊ทผ ๋ฐฉ์์ ํ๊ฐํ๊ณ ์์ผ๋ฉฐ mp4 ๋์ฒด ๋ฐฉ๋ฒ๋ ์ฌ์ฉํ ์ค๋น๊ฐ ๋์ด ์์ต๋๋ค.
๋๋ ์ ฐ์ด๋๋ฅผ ๋ฏธ์ธ ์กฐ์ ํ๋ ๋ชจ๋ ์ฌ๋์ ๋์์ผ๋ก ์์ ์๋ฃจ์ ์ ์ฐพ๋ ๋ฐ ๋ ๋ฌ์ ๋ณด๋์ต๋๋ค. ์ ๋ง ๊ฐ์ฌํฉ๋๋ค. ๋ค๋ฅธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๋ฐ ๋ ๋ง์ ์๊ฐ์ ํ ์ ํด์ผ ํ๋ค๋ ์๋ฏธ์ ๋๋ค.
ํ๋๊ฐ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ทธ๋ค์ flipy / HLS / webgl ๋ฌธ์ ๋ฅผ ์ ํ ์๋ํ๊ณ ์์ ํ๋ ค๊ณ ์ ์ฐ์ง ์์์ต๋๋ค. ๋ด๊ฐ ๋ง๋ ํฐ์ผ์์ ๋ณผ ์ ์์ต๋๋ค.
๊ทธ๋ค์ ๊ฒฐ๊ตญ CORS ๋ฌธ์ ๋ฅผ ์์ ํ์ ๋ฟ์ ๋๋ค. ๋น๋ก ๊ทธ๋ค์ด Dash๋ฅผ ์๋์ํฌ ์ ์์๋์ง ์์ง ํ์ ํ ์ ์์ง๋ง.
์ ํ/์นํท์ ๋ด ํธ์ ์๋ ๊ฐ์๋ค. ๊ทธ๊ฒ์ ๋ด๊ฐ ์ง์ ๊ฐ์ ๊ณ ์ณ์ผ ํ๊ณ C++๋ฅผ ํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํ ์ ์์ต๋๋ค. ๊ณ ์น๋ฉด ์ ๋ง ์๊ธฐ๊ฒ ์ง๋ง ๋จธ๋ฆฌ๋ ๊ณ์ ์ ์งํ๊ณ ์ถ์ด์.
FlipY๊ฐ ํ์ฑํ/๋นํ์ฑํ๋์ด ์๋์ง ํ์ธํ๊ธฐ ์ํด ๋๊ตฐ๊ฐ ์ ๋ฅผ ์ํด ์ฝ๋๋ฅผ ๊ฒ์ํ ์ ์์ต๋๊น?
์ฌ๊ธฐ ๋ด ์๊ฒฌ์ ์ฐธ์กฐํ์ญ์์ค. ๋๋ ์ด ๋ฐฉํด ๊ณต์์ ์์ ํ ๋ฐฐ๋ถ๋ฅด๊ฒ ๋จน์์ต๋๋ค. ํ ์ค์ฒ์์ flipY๋ฅผ ๋นํ์ฑํํ๋ฉด ๊ทธ๋ฆผ์ด ํ์๋์ง๋ง ๊ฑฐ๊พธ๋ก ํ์๋ฉ๋๋ค. ์ฌ๊ธฐ ๊ฒ์์ ํ๋ ์์ด ์์ต๋๋ค. ์์์ผ๋ก ๋์๊ฐ๋๋ค. ๊ทธ๋ค์ IOS9์์ ๋ฌธ์ ์๋ ํ๊ท๋ฅผ ์ผ์ผ์ผฐ์ต๋๋ค.
ํ ๋ฒ๋ ๋ณด๊ฑฐ๋ ์ฒ๋ฆฌ๋์ง ์์ ์๋ ์นํท ํฐ์ผ์ ๋ซ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฆ๊ฑฐ๋ฅผ ๋ชจ์ผ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฏ๋ก ๊ณง ์๋ก์ด ๊ฒ์ ์์ํ์ญ์์ค.
์๋ FlipY ๋ฌธ์ ๋ฅผ ๋์ด์ฐ์ต๋๋ค. ๊ทธ๋ค์ OS๋ฅผ ์ถ์ํ๊ธฐ ์ ์ HLS๊ฐ WebGL๊ณผ ์๋ํ๋์ง ํ์ธํ๋ ๊ฒ์กฐ์ฐจ ๊ท์ฐฎ๊ฒํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ ์๋ก์ด ๊ฒ์ ์์ํ๊ธฐ ์ํด ์๋์ ์นํท ํฐ์ผ์ ๋ซ์์ต๋๋ค. ํนํ webgl์ด ์๋ HLS ๋น๋์ค ํ ์ค์ฒ๋ ์์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ด ์์ ํ ๊นจ์ก์ต๋๋ค. ์๋ FlipY ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ ์ด์ ๊ด๋ จ์ด ์์ต๋๋ค.
๋๋ ๋ชจ๋ webkit webgl ์ ํฉ์ฑ ํ ์คํธ๊ฐ Mp4๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
๊ทธ๋ค์ Apple์ ์์ฒด ์คํธ๋ฆฌ๋ฐ ํ์์ผ๋ก ํ ์คํธํ๋ ๊ฒ์ ๊ท์ฐฎ๊ฒ ํ ์ ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์๋ก์ด IOS 11 ์ ๋ฐ์ดํธ๋ก ๊ณ ์ฅ ๋ฌ๊ณ ์ฌ์ ํ ๊ณ ์ฅ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
@danrossi ์๋ก ์คํํ ์นํท ํฐ์ผ ๋งํฌ ์๋์? ์ ๋ iOS11์์ ์ด ๋ฌธ์ ๋ฅผ ์ฐ์ฐํ ๋ฐ๊ฒฌํ์ผ๋ฉฐ ๋ชจ๋ ๊ฐ๋ฐ์ ์ถ์ ํ๊ณ ์ถ์ต๋๋ค.
๋๋ ๊ทธ๋ค์ ์ํด ๊ทธ๋ค์ ์์ ์ ์์ฒด ์๊ธ์ ์ง์ํ๊ณ ์์ต๋๋ค. Khronos ํ ์คํธ mp4 ํ์ผ์์ ์์ฑ๋ HLS๋ก ์ ํฉ์ฑ ํ ์คํธ๋ฅผ ์คํํ๊ณ ์์ต๋๋ค. ํต๊ณผํ๋ค๊ณ ์ฃผ์ฅํ์ง๋ง ํ ์คํธ๋ ์๋ฌด๊ฒ๋ ํ์ํ์ง ์๋์ง ์ฆ๋ช ํ์ง ๋ชปํฉ๋๋ค. ์บ๋ฒ์ค๋ ์ฌ๊ธฐ์ ํ์๋์ง ์์ต๋๋ค. ์ฌ์ค IOS์์๋ ํ ์คํธ๊ฐ ์ ๋๋ก ์๋ํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ก๊ทธ๊ฐ ์์ต๋๋ค.
HLS ํ ์ค์ฒ๊ฐ ์๋ํ์ง ์๋๋ค๋ ๊ฒ์ ์ฆ๋ช ํ๊ธฐ ์ํด ์์ฒด ํ ์คํธ ํ์ผ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋๋ ๋ค๋ฅธ ํ ์คํธ ํ์ผ์ ๊ตฌ์ถํ๊ณ ํฐ์ผ์ ๋ง๋ค๊ธฐ ์ํด ์ ๋ก๋ํ ๊ฒ์ ๋๋ค.
webgl ๋งค๊ฐ๋ณ์๊ฐ ํ์ํ๊ฑฐ๋ ์ง๋๋ฒ์ฒ๋ผ ๋นํ์ฑํํด์ผ ํ๋ ๋งค๊ฐ๋ณ์๊ฐ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ด๊ฐ ์นํท ํ ์คํธ ํ์ผ์ ๋ณด๋ ํ ์ข์ต๋๋ค. IOS ํ ์คํธ์ฉ์ผ๋ก ์ค๊ณ๋์ง ์์์ต๋๋ค. ์ฌ์ํ ์ฌ์ฉ์ ํด๋ฆญ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์์ฑ์ด ์ง์ ๋์ง ์์์ง๋ง HLS๋ ์ฌ์ ํ ํ ์ ์์ง๋ง ์ด๋ค ์ด์ ๋ก Mp4๋ IOS 11์์ ๋ฐ๊ฒฌํ ์๋ ์ฌ์์ด ๊ฐ๋ฅํฉ๋๋ค.
IOS๋ฅผ ์ํด ํน๋ณํ ์ํ๋ ํ ์คํธ๋ ์์ผ๋ฉฐ HLS์ ๋ํ ํ ์คํธ๋ ๊ฐ์ฅ ํ์คํ๊ฒ ์ด๋ฃจ์ด์ง์ง ์์์ต๋๋ค.
๋ฐ๋ผ์ ๋ฌธ์ . ๊ทธ๊ฒ์ ๋์ ์ด์์ ๋๋ค.
ํฐ์ผ์ ์ ์ถํ๋ ๋ฐ ํ์ํ ๊ฒ์ด ์์ต๋๋ค.
์ต๋ํ ๋ฉ๋ฆฌ ๋ณผ ์. webgl ์นํท ํ ์คํธ์ ๊ฒฐํจ์ด ์์ต๋๋ค. ๊ทธ๋ค์ webgl ์บ๋ฒ์ค ์ถ๋ ฅ์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค. ๊ทธ๋ค์ ๋งค์ฐ ์์ ํฌ๊ธฐ๋ก ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ถ๋ ฅ์ผ๋ก ์บ๋ฒ์ค์ ๋น๋์ค๋ฅผ ๊ทธ๋ฆฌ๊ณ ์์ต๋๋ค.
๊ทธ๋ค์ webgl ์บ๋ฒ์ค๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง ํฌ๊ธฐ๊ฐ ๋งค์ฐ ์๊ธฐ ๋๋ฌธ์ ๋ ๋๋ง ์ฌ๋ถ๋ ์ ์ ์์ต๋๋ค.
HLS์ ๋ํ ํ ์คํธ๋ฅผ ์์ ํด์ผ ํ์ง๋ง ํต๊ณผํ์ง ๋ชปํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ webgl ์บ๋ฒ์ค์ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ์์ผฐ์ต๋๋ค. ๊ฒ์์์ ๋๋ค.
์ฌ์ฉ์๋ฅผ ์ถ๊ฐํ๋๋ก ์ฝ๋๋ฅผ ์์ ํ ํ ํ ์คํธ๊ฐ ์ค์ ๋ก IOS์์ ์คํ๋๊ธฐ ์์ํฉ๋๋ค.
๋ด๊ฐ ๋ณผ ์์๋ ํ HLS์ ๋ํ ํ ์คํธ๊ฐ ์ํ๋์ง ์์์ผ๋ฉฐ ํ ์คํธ์ ๊ฒฐํจ์ด ์์ต๋๋ค. ๊ทธ๋์ ๊ทธ๊ฒ์ ์ ๋์ ์ผ๋ก ๋ชจ๋๋ฅผ ๋ฐฉํดํ์ต๋๋ค.
์ฌ๊ธฐ ์์ต๋๋ค. ๋๋ Apple๊ณผ ๊ทธ๋ค์ ๋ฌธ์ ๋ฅผ ์์ ํ๊ณ ํ ์คํธ๋ฅผ ์คํํ๋ ๋ฐ ์ผ๋ง๋ ๋ง์ ๊ฐ์ธ ์์ ์ด ํ์ํ์ง ์ฐธ์์ฑ์ ์๊ณ ์์ต๋๋ค.
์ดํ์ด๊ณ ๋ณผ ํ์๊ฐ ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด ๊ฒฐ์ฝ ํด๊ฒฐ๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. CORS๋ฅผ ์์ ํ๋ ๋ฐ ๋ช ๋ ์ด ๊ฑธ๋ ธ๊ณ ์ฌ๋ฌ ๋ฒ์ ์ IOS์ ์ฅ์น ์ ๊ทธ๋ ์ด๋๊ฐ ํ์ํ์ต๋๋ค.
๋๋ webgl ํ๋๊ทธ์ ์ ฐ์ด๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ํํ ์ ์๋ ์์ ์ด ์๋์ง ํ์ธํ๋ ค๊ณ ํฉ๋๋ค.
์ฌ๋๋ค์ด ๊ฑฐ๊ธฐ์ ๊ฐ์ ์ฝ๊ฐ์ ์์์ ์ผ์ผํฌ ์ ์์ต๋๊น? ์์ง ์ดํด๋ณด์ง๋ ์์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ค์ ์ค์ ๋ก ์์ฒด ๋ธ๋ผ์ฐ์ ์์ HLS๋ฅผ ํ ์คํธํ๋ ๊ฒ์ ๋ํด ์ ํ ์ ๊ฒฝ ์ฐ์ง ์๋ ๊ฒ์ฒ๋ผ.
@jernoble ์ด ๋ฌธ์ ์ ๋ํด ์นํท ํ์์ ๋๊ฐ ์ฐ๋ฆฌ๋ฅผ ๋์ธ ์ ์๋์ง ์ง์ ํด ์ฃผ์๊ฒ ์ต๋๊น? ๋๊ตฐ๊ฐ๊ฐ ๊ทธ๊ฒ์ ์กฐ์ฌํ๊ฑฐ๋ ์ฐ๋ฆฌ์๊ฒ ์ ๋ฐ์ดํธ๋ฅผ ์ ๊ณตํ ์ ์๋ค๋ฉด ์ ๋ง ๊ฐ์ฌํ ๊ฒ์ ๋๋ค. GitHub์ ๋ฌธ์ ๋ ๊ฝค ๊ธธ์ง๋ง ์ฌ๊ธฐ์ ์์ฝ๋์ด ์์ต๋๋ค: https://bugs.webkit.org/show_bug.cgi?id=179417. ๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์๋ ํ์ธ์ @radiantmediaplayer์ ๋๋ค. @grorg ์ ์ ๋ ๋ชจ๋ ์ด ๋ฌธ์ ์ ๋ํด ํํ ์ ์๋ ์ ์์์ ๋๋ค. ๋๋ WebKit ๋ฒ๊ทธ๋ฅผ ์ฐธ์กฐํ๊ณ ์ด๋ฅผ ์ถ์ ํ๋ ๋ ์ด๋๋ฅผ ๋ง๋ค ๊ฒ์ ๋๋ค.
์๋ค ์. @sorob์์ ์ค๋ช ํ ๋๋ก ์์ ์บ๋ฒ์ค๋ฅผ ์ฌ์ฉํ์ฌ iOS 11์ ๋ํ ์ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฒ์ํ๊ณ ์์ต๋๋ค. http://redgetan.cc/demo/ios_11_hls_webgl_canvas_workaround/index.html ์์ ์๋ํ๋ ๊ฒ์ ๋ณผ ์
์บ๋ฒ์ค ๋ ๋๋ฌ. ๊ทธ๊ฒ์ ์ํํธ์จ์ด ๋ ๋๋ง์ ๋๋ค. ์์ฐ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๋๋ ์ด๊ฒ ์
@danrossi ๋ฐฉ๊ธ ์ด ๋ฌธ์ ๊ฐ ์ข ๋ฃ๋์์์ ์์์ต๋๋ค. ๋ค์ ์ด์ด์ฃผ์๊ฒ ์ต๋๊น?
์๋ก์ด ๋ฌธ์ ๊ฐ ์ฌ๊ธฐ์ ์์ต๋๋ค. Three.JS์ ๊ด๋ จ์ด ์์ผ๋ฏ๋ก ์์นด์ด๋ธ์ฉ์ผ๋ก ๋ณด๊ด๋ฉ๋๋ค.
์๊ตฌ๋๋ ์ํ์ ์์ค์ ๋ฏธ์ณค๋ค. IOS10 ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๊ฒ์ฒ๋ผ ํ๋ฆฌ๊ฐ ๋ถ๋ฌ์ก์ต๋๋ค. ๊ฑฐ๊ธฐ ์ข ๋ด.
์ง๊ธ๊น์ง ์๋ฌด ๊ฒ๋ ์๋ํ์ง ์์ต๋๋ค. ๋๊ตฐ๊ฐ ๋ง์นจ๋ด ์ฐ๋ฆฌ์ ํต์ ๊ฐ ์๋ ์ดํด๋ณด๊ณ ์์ต๋๋ค. HLS๋ฅผ ๋ณด๋ ํ ์ค์ฒ์ ์ปจํ ์คํธ์ ๋ํ ๊ณต์ ์ฐธ์กฐ์ ๊ด๋ จ์ด ์๋ ๊ฒ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ Mp4์ ๋ค๋ฆ ๋๋ค. ๋ด๊ฐ ๋ชจ์ผ๋ ํ ๊ทธ๋ค์ ์ค์ ๋ก ๊ทธ๊ฒ์ํ๊ธฐ ์ํด ์๊ฐ์ ๋ณด๋ด์ผํฉ๋๋ค. Windows์์์ ๊ฐ์ ๋น๋ ํ๊ฒฝ์ ์ค์ ํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์นํท ์ฝ๋๋ฅผ ๋ณด๋ฉด IOS10์ HLS์ ์ด์ํ ์์ ๋ฌธ์ ๊ฐ ์์๋ ์ด์ ๊ฐ ์ค๋ช ๋ฉ๋๋ค. ์์ ๊ณต๊ฐ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ IOS10/Safari์์ ๋ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ๋ชจ๋ ํด๊ฒฐํ๋ ์ฝ๋์ ๋๋ค.
์๋ ํ์ธ์. IE11 ๋น๋์ค ํ ์ค์ฒ ์ง์์ ์ํด ์บ๋ฒ์ค ๋ ๋๋ฌ๋ฅผ ๋กค๋ฐฑํ๊ณ ๊ตฌํํด์ผ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. WebGL์์๋ ์๋ํ์ง ์์ต๋๋ค. ๋๊ตฐ๊ฐ ๊ทธ๊ฒ์ ๋ํด ๋ฌป๊ณ ์์์ต๋๋ค.
์ ์๊ฐ์๋ ์๋ฆฌํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๋๋ฅผ ์๊ฐํ๋ฉด 2๋ ์ ๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
IOS 11์ HLS์ ๋ํ ์ํํธ์จ์ด ๋ ๋๋ง์ผ๋ก ์ด๋ ค์์ ๊ฒช์ ๊ฒ์ ๋๋ค. ํด์งํต์๋ ๋ชจ๋ IOS๊ฐ VR์ฉ์ ๋๋ค. ์ง์ ๊ตฌํํ๊ฒ ์ต๋๋ค.
@redgetan , three.js๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น? CanvasRenderer๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ์๋ํ๋๋ฐ ํ ์ค์ฒ ์์ ๋ฉ์ ํ๋ ์์ด ํ์๋๊ณ spheregeometry๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋งํ์ง ์์ต๋๋ค.
์บ๋ฒ์ค 3 ๋ฐ๋ชจ๋ ๋ ๋๋ง๋๋ 2D ๋น๋์ค๋ง ๋ณด์ฌ์ค๋๋ค.
์ฃ์กํฉ๋๋ค. webgl render๋ฅผ ์ฌ์ฉํ๊ณ ์์ง๋ง ์บ๋ฒ์ค๋ฅผ ํ ์ค์ฒ ์ด๋ฏธ์ง ์์ค๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ณต์ ํ ์ ์๋์ง ํ์ธํ๋ ์ค์ ๋๋ค. ์บ๋ฒ์ค๋ฅผ ํ ์ค์ฒ๋ก ์ฌ์ฉํ ๋ ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋ง ๋ฐ ํ์ ๋์ง ์์ต๋๋ค.
์ข์, ์ด๋ค ์ด์ ๋ก ๋๋ ์ด๊ฒ์ํด์ผํ๋ค.
webgl ๋ ๋๋ฌ๋ฅผ ์ ์์ ์ผ๋ก ์ฌ์ฉํ์ญ์์ค. ๊ทธ๋ฌ๋ ์บ๋ฒ์ค ์ง๊ฐ๊ณผ ๋น๋์ค ๋๋ก์์ ๊ฒฝ์ฐ ์น์๋ฅผ ์ค์ ํด์ผ ํ์ต๋๋ค.
imageContext.drawImage( video, 0, 0, image.width, image.height );
์ง๊ธ ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋ง๋๊ณ ์์ต๋๋ค. IOS 11์์ ํ ์คํธ๋ฅผ ์คํํฉ๋๋ค.
@danrossi ๋ iOS 11์์ ์ด๋ป๊ฒ ์งํ๋๋์ง ์๋ ค ์ฃผ์์ต๋๋ค. ์ค์ ๋ก ์ด๋ ์์ ์์ ๊ทธ ๊ธธ์ ๊ฐ์ผ ํ ์๋ ์์ต๋๋ค.
์์์ด์, ๊ฑฑ์ ํ์ง ๋ง์ธ์. fps ํต๊ณ ๋ณด๊ธฐ๊ฐ ์๋ํ๋ ๊ฒ ๊ฐ์ผ๋ฉด ๊ณง ์จ๋ผ์ธ์ผ๋ก ๊ธฐ๋ณธ ํ ์คํธ๋ฅผ ์ถ๊ฐํ ๊ฒ์ ๋๋ค. ์ง๊ธ ๋น์ฅ ํ์ํ ๊ฒ์ด ์์ ์ ์์ต๋๋ค.
IOS์์ ํ๋ก์ธ์ ์ฑ๋ฅ์ ํ์ธํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์บ๋ฒ์ค ์ง๊ฐ ํ ์คํธ๋ฅผ ํด๋ณด์์ต๋๋ค. ์๋ํ์ง๋ง ๋ ํฐ ํด์๋์ ๋น๋์ค๋ ๋์ด์ง ์ ์์ต๋๋ค.
์ด HLS๋ ํ์ง์ด ๋ฎ์ผ๋ฏ๋ก 40fps๋ก ์ ์ง๋ฉ๋๋ค. ๋ ํฐ ํด์๋์ mp4์ด์ง๋ง ๋ฎ์ ํ์ง์ 30fps๋ก ์ ์ง๋์์ต๋๋ค.
ํ๋ก๋์ ํด์๋ ํ์ผ์ 10fps๋ฅผ ์ป์ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์๋ก์ด ์์ดํจ๋์ฉ์ ๋๋ค.
์ด ๋ฌธ์ ๋ ์ง๊ธ ์ด ํ์ด์ง์์ ์ง๋ฉดํ๊ณ ์๋ ๋ฌธ์ ์ ๊ด๋ จ์ด ์์ต๋๊น? https://digitalejulegaver.firebaseapp.com/#catarina
Mac์ Safari ๋ธ๋ผ์ฐ์ ๋๋ macOS ์ฅ์น์์ ์ฝ๋๋ค. ์์ดํจ๋๋ ์์ดํฐ์ ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ๋ ๋ชจ์ง๋ผ์ ์๋๋ผ๋ ์ด ํ ํ์ด์ง๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๊ฒ์์ ํ์ด์ง๊ฐ ํ์๋์ง๋ง Mac์ ์ผ๋ฐ ํฌ๋กฌ์์๋ ์๋ํฉ๋๋ค.
@vongohren ์ด ํฐ์ผ์์ ์์ ํ macOS Safari ๋ฐ ์ ฐ์ด๋์ ํจ๊ป HLS์ ๋ํด ๋ฐ๊ฒฌํ FlipY ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋๋ ์นํท ํฐ์ผ์ผ๋ก ๋์์๊ณ ๊ทธ๋ค์ 10.13์ ๋ํ FlipY ๋ฌธ์ ๋ฅผ ์์ ํ๋ค๊ณ ์ฃผ์ฅํ์ต๋๋ค. ํ์ด ์์๋ผ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ macOS๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก ํ ์คํธํ ๊ธฐํ๊ฐ ์์ต๋๋ค.
์ด๋ฅผ ์ํด์๋ 10.13์ ๋ํ FlipY ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ํ์ํ์ง ์์ ๋ ๋ค๋ฅธ ํ๋ซํผ ๋ฒ์ ํ์ธ์ด ํ์ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ฒ์ 13 ์ดํ์์๋ ํ์ํฉ๋๋ค. ์ฌ๋ฌ ๋ฒ๊ทธ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด macOS ๋ฐ IOS์ ๋ํด ์ฝ 4๊ฐ์ ๋ค๋ฅธ ํ๋ซํผ ๋ฐ ๋ธ๋ผ์ฐ์ ๋ฒ์ ํ์ธ์ด ์์ต๋๋ค. IOS 11 ๊ฒ์ฌ๋ ์ํํธ์จ์ด ํ ์ค์ฒ ๋ ๋๋ง์ ์ผ๋ ๊ฒ์ ๋๋ค!
10.13์ ํ์ธํ ์ ์๋ค๋ฉด ๋์์ด ๋ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ ๋ด ๋ชจ๋ ํฐ์ผ์ ์ธ๋ถ ์ ๋ณด๊ฐ ์์ต๋๋ค.
https://bugs.webkit.org/show_bug.cgi?id=179417#c8
https://bugs.webkit.org/show_bug.cgi?id=176491
@danrossi Iv๋ 10.13์ ์ป์์ง๋ง ํ ์คํธํ ์ ์๋ ๋ฐ๋ชจ๊ฐ ์์ต๋๊น?
์ง๊ธ ์ฌ์ฉํ๊ณ ์๋ three.js ๋ฒ์ ์ ์ด๋ฌํ ์์ ์ฌํญ์ ์๋ก์ด ๊ฒ์ด๋ฏ๋ก ์ ์ฉํ ์์น๋ฅผ ๋ชจ๋ฆ
๋๋ค.
๋๋ data.flipY๋ผ๋ ๊ฒ์ ๋ฐ๊ฒฌํ๊ณ ๊ทธ๊ฒ์ false๋ก ์ค์ ํ์ต๋๋ค. ํ์ง๋ง ๋ด ์ฑ์๋ ์๋ฌด ๊ฒ๋ ํ์ง ์์์ต๋๋ค.
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด three.js๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. https://github.com/iberezansky/flip-book-jquery
CORS ๋ฌธ์ ?
์ด๊ฒ์ด ์๋ํฉ๋๊น?
http://dev.electroteque.org/webgl/three-hls.html
์๋๋ฉด ์ด๊ฑฐ
http://dev.electroteque.org/webgl/three-hls-flipy.html
๋ด ๋ฐฉ๋ํ ํ ์คํธ ํ์ผ ๋ชฉ๋ก์ด ํด๋น ํฐ์ผ์ ์์ต๋๋ค.
ํ ์ค์ฒ์์ FlipY๋ฅผ ๋นํ์ฑํํ ์ ์์ต๋๋ค.
texture.flipY = false;
๋ชจ๋ ๊ฒ์ด ๋ก์ปฌ์ ์์ผ๋ฏ๋ก cors๊ฐ ์ํฅ์ ๋ฐ์์ผ ํ๋ ์ด์ ๋ฅผ ์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ ๋งํฌ๋ โโMac 10.13์์ ์ฌํ๋ฆฌ์ ํฌ๋กฌ ๋ชจ๋์์ ๊ฒ์์์ผ๋ก ํ์๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋ฆฝ ๊ธฐ๋ฅ์ ๋จ์ง ๊ทธ๋ฆผ์ ๋ค์ง๋ ๊ฒ๋ณด๋ค ๋ง์ ์ผ์ ํ์ง ์์์ต๋๋ค. ํ์ง๋ง ์ฌ์ ํ ๊ฒ์์์ด์๋ค
10.13์์ FlipY ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์๋ IOS 11๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ์ด๊ฒ์ ์ข์ ์ ๋ณด์ ๋๋ค. ๋ณด๊ณ ํด์ผ ํ ๋ ๋ค๋ฅธ ๋ฒ๊ทธ. ๋๋ฌด ์ง์ ๋ถํด์ ์ ๋ฅผ ๋ฏธ์น๊ฒ ํฉ๋๋ค. IOS ํฐ์ผ์์ ์ ๋ฐ์ดํธํ๊ฒ ์ต๋๋ค. 10.12์์ FlipY ๋ฒ๊ทธ๋ ํด๊ฒฐ๋์ด์ผ ํ๋ฉฐ ์ด์ ๋ํ ๋ณ๋์ ํฐ์ผ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
๊ทธ๋์ ์ง๊ธ ๋ด VR ๊ธฐ๋ฅ ์์์ฒ๋ผ . IOS 11 ๋ฐ 10.13์ ๋ํ ํ๋ซํผ ๋ฒ์ ํ์ธ์ ์ํํ๊ณ hls์ ๋ํ ์ํํธ์จ์ด ๋ ๋๋ง ์บ๋ฒ์ค ํ ์ค์ฒ ๋ชจ๋๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค.
์ฌ๊ธฐ์ ๊ธฐ๋ฅ ๊ฒ์ฌ, ํนํ cors ์ง์ ๋๋ cors ํ๋ก์ ์์ค ์ฌ์ฉ์ ์ฌ์ฉํ๋ ๋ช ๊ฐ์ง ์ ์ ์ ํธ๋ฆฌํฐ๊ฐ ์์ต๋๋ค. ๋ถ๋ช ํ ์ด์ IOS 11๊ณผ ๊ฐ์ ์ํํธ์จ์ด ๋ ๋๋ง์ ์ผ์์ ์ผ๋ก ์ผ๊ธฐ ์ํด 13๋ณด๋ค ํฐ ๋ฒ์ ์ ํ์ธํด์ผ ํฉ๋๋ค.
static get supportsCORS() {
let testVideo = document.createElement("video"),
hasCORS = false,
userAgent = navigator.userAgent;
testVideo.crossOrigin = "anonymous";
hasCORS = testVideo.hasAttribute("crossOrigin");
testVideo = null;
if (hasCORS) {
//if (_isSafari = WebVRUtils.safariCheck(userAgent)) {
if (_isSafari) {
return WebVRUtils.isNewSafari(userAgent);
}
//cors support check for IE 11 support.
_corsSupported = true;
return true;
}
return false;
}
static isNewSafari(userAgent) {
const osxVersion = /Mac OS X (10[\.\_\d]+)/.exec(userAgent);
if (osxVersion) {
//check for safari test to fix HLS problems.
// _olderSafari = _browserVersion.match(/(\d+).(\d+).?(\d+)?/)[1] <= 10;
const version = osxVersion[1].split("_")[1];
return +version >= 12;
}
return WebVRUtils.isNewIOS(userAgent);
}
static isNewIOS(userAgent) {
const version = navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/)[1];
_isLatestIOS = (+version >= 11);
return _isLatestIOS;
}
๋น์ ์ ์ด๊ฒ์ ๋ํด ๋ช ๊ฐ์ง ํ๋ฅญํ ์์ ์ ์ํํ์ต๋๋ค. ํฐ์ผ์ด ์ ๋ฆฌ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค :D
๋ค์์ ์บ๋ฒ์ค ์ง๊ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค. IOS 11์ฉ์ผ๋ก ํ์ฑํํด์ผ ํ์ต๋๋ค. macOS 13 ๋ฒ์ ํ์ธ์ ์ํํ๊ณ ํ์ฑํํด์ผ ํ ์๋ ์์ต๋๋ค. 10.13์์ flipY ์์ ์ด ์ค๋จ๋์๋ค๊ณ ์๊ฐํ๋ค๋ฉด? ๊ทธ๋ค์๊ฒ ๋ค์ ๋ณด๊ณ ํด์ผ ํฉ๋๋ค.
๋น์ ์ ์ ํ ๋ชจ๋ฅด๋ ์น๊ตฌ, ๋๋ ์์ฒด ์๊ธ์ผ๋ก ๊ทธ๊ฒ์ผ๋ก๋ถํฐ ์ด๋ค ์ด์ต๋ ์ป์ง ๋ชปํฉ๋๋ค. ๋ด ์์ ์ ๊ธฐ๋ฅ์ ํฌํจํ์ฌ ๋ชจ๋ ์ฌ๋์ ์ํํธ์จ์ด๋ฅผ Apple OS์์ ๊ฑฐ์ ์๋ํ์ง ์๊ฒ ๋ง๋๋ ๊ฒ ์ธ์๋ haha.
์ฌ๊ธฐ์ ์ง๊ธ ๋ด ์ ์ฒด ํตํฉ์ด ์์ผ๋ฉฐ ์ฌ๊ณผ ์์ ๋ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ํฌํจํ ์์ ์ด ์์ต๋๋ค. ์ด์ ํ๋ธ๋งต ๋น๋์ค๋ฅผ ์ง์ํฉ๋๋ค.
https://flowplayer.electroteque.org/vr360/fp6
์ด๊ฒ์ ๋ด๊ฐ ๋ช ๋ ์ ์ ์๋ฌด ๊ฒ๋ ํ์ง ์๊ณ ์์ ์๋ ๊ฒ์ ์ฒ์ ๋ณด๊ณ ํ ์ดํ๋ก ๊ณ์ ์งํ๋๊ณ ์์ต๋๋ค!
์ด๊ฒ์ด ๋น์ ์ ์ํด ์๋ํฉ๋๊น?
์ฌ๊ธฐ ์บ๋ฒ์ค ์ง๊ฐ์ด ํด๊ฒฐ๋์๋ค๊ณ ๋งํ ๋ ์ด๋๋ฅผ ๊ฐ๋ฆฌํต๋๊น?
๊ทธ ํ๋ก์ฐ ํ๋ ์ด์ด๋ ๋ฌ์ฝคํด ๋ณด์ ๋๋ค! ๋ง์ด ์ฌ์ฉํ์ จ๋์?
์ด ๋งํฌ์์ ๋ฌด์์ ๋ณผ ์ ์์ต๋๊น? http://dev.electroteque.org/webgl/three-canvas.html?
Chrome - ๋ฒ์ 63.0.3239.84(๊ณต์ ๋น๋)(64๋นํธ) - macOS 10.13.1์์ ์ด ๋:
์ผ์ชฝ ๋ชจ์๋ฆฌ์ FPS ๋ฏธํฐ๊ฐ ์๋ ๊ฒ์์ ๋ฐฐ๊ฒฝ๊ณผ ๊ฐ์ด๋ฐ ํ๋จ์ AR ํ์ฑํ ๋ฒํผ์ด ํ์๋ฉ๋๋ค.
๊ทธ๊ฒ์ ํด๋ฆญํ๋ฉด ์ค์ ํ ๊ณผ ๋ค๋ก ๋ฒํผ์ด ์๋ ๋ถํ ํ๋ฉด์ด ๋ํ๋ฉ๋๋ค. ํ์ง๋ง ์บ๋ฒ์ค ์์ฒด๋ ๊ฒ์์์ผ ๋ฟ์
๋๋ค.
macOS 10.13.1์ Safari ๋ฒ์ 11.0.1(13604.3.5)์์ ์ด ๋:
์ผ์ชฝ ๋ชจ์๋ฆฌ์ FPS ๋ฏธํฐ๊ฐ ์๋ ๋นํ ๋์์์ด ๋ณด์ด๊ณ ๊ฐ์ด๋ฐ ํ๋จ์ AR ํ์ฑํ ๋ฒํผ์ด ์์ต๋๋ค. ์ ์ฒด 360๋ ๊ฒฝํ์ ์ํด ์คํฌ๋กคํ ์๋ ์์ต๋๋ค.
VR ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ค์ ํ ๊ณผ ๋ค๋ก ๋ฒํผ์ด ์๋ ๋ถํ ํ๋ฉด์ด ๋ํ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น๋์ค ์บ๋ฒ์ค๋ ์คํฌ๋กคํ ์ ์์ง๋ง ์์ด๋ก๊ฐ ์ ์ดํ๊ธฐ ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
ํ์ง๋ง VR ๋ชจ๋์์ ๋ค๋ก ๋ฒํผ์ ๋๋ฅด๋ฉด ๋น๋์ค๊ฐ VR ๋ชจ๋์์ ๋ฉ์ถ๊ณ ๋ ์ด์ ์คํฌ๋กคํ ์ ์์ผ๋ฉฐ VR ๋ชจ๋๊ฐ ์์๋ ๋ณด๊ธฐ์์ ๋ฉ์ถ๊ฒ ๋ฉ๋๋ค.
ํด๋น ๋ฐ๋ชจ๋ Safari์์ HLS ๋ ๋๋ง์ ์ํ ๊ฒ์ ๋๋ค. Safari์์ flipY ์์ ๋ฐ๋ชจ๊ฐ ์๋ํ์ง ์๋๋ค๊ณ ์๊ฐ๋๋ ๊ฒฝ์ฐ
http://dev.electroteque.org/webgl/three-hls-flipy.html
๊ทธ๋ฐ ๋ค์ 10.13 ๋ฐ IOS 11 Safari์์ ์บ๋ฒ์ค ํ ์ค์ฒ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๊น?
http://dev.electroteque.org/webgl/three-canvas.html
๋ ์ฌ์ด๋ฅผ ์๋ ค์ฃผ์ธ์. ๊ฒ์ ์ ํ๋ ์์ด ์๋ ๋ ๋๋ง๋๋ ํ์ ์ปจํธ๋กค์ ๋ํด์๋ ๊ด์ฌ์ด ์์ต๋๋ค.
์ง๊ธ ์ฌ๊ธฐ์์ ์ฐธ์กฐํ๋ IOS 11 ์นํท ํฐ์ผ์ 10.13์ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ 10.13์ ๋ํด ์ค์ํฉ๋๋ค. HLS ๋ ๋๋ง์ ์์ ํ ๋ง๊ฐ๋จ๋ฆฐ "ํ๊ท"๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
@danrossi๋ ๋ ๋ค ์ฌํ๋ฆฌ์์ ์๋ํ๋ฉฐ hls ๋ฒ์ ์ผ๋ก ๋ ๋์ ํ์ง์ ์ ๊ณตํฉ๋๋ค. ๊ถ๊ธํ๋ค๋ฉด ๋ ๋ค ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ ๋๋ค.
๊ทธ๋ฌ๋ ์๋ฌด๋ ํฌ๋กฌ์์ ์๋ํ์ง ์์์ต๋๋ค.
์ข์์. ๋ณด๊ณ ๋ฅผ ์ทจ์ํด์ผ ํฉ๋๋ค.
๊ทธ๋์ ์ด๊ฒ์ ์ฌ์ ํ โโ๋ฌธ์ ๊ฐ ๋ง์ต๋๊น?
http://dev.electroteque.org/webgl/three-hls.html
์ด ๊ฒฝ์ฐ macOS์ ํ์ค์ผ๋ก FlipY ์์ ์ ์ฌ์ฉํ์ญ์์ค.
์ด ํ์ด์ง์ HLS ๋ฐ๋ชจ๋ ๋ ๋ธ๋ผ์ฐ์ ๋ชจ๋์์ ์๋ํด์ผ ํฉ๋๋ค. hls ํ๋ฌ๊ทธ์ธ๊ณผ ํจ๊ป ํฌ๋กฌ์ฉ ๋ฏธ๋์ด ์์ค ์คํธ๋ฆฌ๋ฐ์ ์ฌ์ฉํฉ๋๋ค. ๋ํ macOS์ ๋ํ FlipY ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๋น์ ์ด ์ฌ๋ฐ๋ฅธ์ง
http://dev.electroteque.org/webgl/three-hls.html
์ด๊ฒ์ ํฌ๋กฌ์ด๋ ์ฌํ๋ฆฌ์์ ์๋ํ์ง ์์ต๋๋ค.
๋งํฌ flowplayer๋ ๋ ๋ธ๋ผ์ฐ์ ๋ชจ๋์์ ์๋ํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค ์ฑํผ์ธ. ํฐ์ผ์ ๋ค์ ์ ๋ฐ์ดํธํ๊ธฐ์ ์ถฉ๋ถํ ์ ๋ณด๊ฐ ์์์ต๋๋ค. macOS Safari ๋ฌธ์ ๋ IOS 11 ๋ฌธ์ ์ ๋ค๋ฆ ๋๋ค.
IOS 11์ฉ ์บ๋ฒ์ค ํ ์ค์ฒ ์์ ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ macOS Safari์ ๊ฒฝ์ฐ ํ ์ค์ฒ์์ FlipY๋ฅผ ๋นํ์ฑํํ๊ณ ์ ฐ์ด๋์์ Y ์์น๋ฅผ ๋ฐ๊ฟ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ๋๋ฆฝ๋๋ค. IOS 10 HLS์ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋์์๋ ์์ ์ฑ๋ ๋ฐ์ ์ ์ํํด์ผ ํฉ๋๋ค. ์ ฐ์ด๋ ์ฝ๋๋ ์์ ์์ต๋๋ค.
๊ทธ๋์ ์ ๋ ์ค๋ ์์นจ์ ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก iOS 11 ์ผ์ด์ค๋ฅผ ๊นจ๋ ๋ฐ ์ฑ๊ณตํ์ ๋ ์ฝ 1์๊ฐ ๋์ ๊ธฐ๋ปค์ต๋๋ค( @danrossi ์ ๋ http://dev.electroteque.org/webgl/three-canvas.html์ ์๋ ๊ทํ์ ์์์ ์๊ฐ์ ์ป์์ต๋๋ค) ... ํ์ง๋ง ์๊ฒฝ์ ์ฐ๊ณ ์ฌ๋ง์ ํ์ ์๋์ ์ผ์ ์กฐ๊ฐ์ฒ๋ผ ๋๊ปด์ก์ต๋๋ค.
์ด๊ฒ์ iOS 11.2.1์ด ์ค์น๋ iPhone 6 Plus์์ ์ป์ ๊ฒฐ๊ณผ์
๋๋ค. ์ ๋๋ฉ์ด์
์ ์ค์ ๋ก ๋งค์ฐ ๋ถ๋๋ฝ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์ถ์
ํ๊ณ ํฝ์
ํ๋๊ณ ์จ๋ฆฌ์ด์ค๊ฐ ์์ต๋๋ค ...
์์๋๋ ๋์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค(Android 8 ๋ฐ ์ต์ Chrome์ Nexus 5X - ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ง ์์).
์ฐ๋ฆฌ์ ์ฌ์ฉ ์ฌ๋ก๋ 360 HTML5 ํ๋ ์ด์ด์ด๋ฉฐ ๋น๋์ค ์์ ๋ ์ํ ๋ชจ๋ ๋์ผํ HLS ๋จ์ผ ๋นํธ ์ ์ก๋ฅ ํผ๋ http://www.rmp-streaming.com :1935/vod/sea360.mp4/playlist.m3u8์ ๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ(๋ด ์ฝ๋๋ ์๋ ์ฐธ์กฐ)์ Android์ ์ ์ฉํ๋ฉด ๋์ผํ ๋ชป์๊ธด ๋ ๋๋ง์ด ๋ํ๋ฉ๋๋ค. ์ด ์๋ก์ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ์ป์ ์ ์๋ ๊ฒ์
๋๊น, ์๋๋ฉด ๋๋ฝ๋ ๊ฒ์ด ์์ต๋๊น?
์ผ๋ถ ์ค์ ์ ์ฌ์ฉํ์ฌ ์ฌ์ํ๋ ค๊ณ ํ์ง๋ง ๋์ ๋๋ ๊ฐ์ ์ด ๋ณด์ด์ง ์์ต๋๋ค.
// image
this.image360 = document.createElement('canvas');
this.image360.width = this.width;
this.image360.height = this.height;
this.imageContext360 = this.image360.getContext('2d');
this.imageContext360.fillStyle = '#000000';
this.imageContext360.fillRect(0, 0, this.width, this.height);
// texture
this.texture360 = new THREE.Texture(this.image360);
this.texture360.format = THREE.RGBFormat;
this.texture360.minFilter = THREE.LinearFilter;
this.texture360.magFilter = THREE.LinearFilter;
this.texture360.generateMipmaps = false;
this.texture360.wrapS = THREE.ClampToEdgeWrapping;
this.texture360.wrapT = THREE.ClampToEdgeWrapping;
this.texture360.flipY = true;
this.texture360.needsUpdate = true;
// mesh
let geometry = new THREE.SphereGeometry(500, 80, 50);
geometry.scale(-1, 1, 1);
let material = new THREE.MeshBasicMaterial({ map: this.texture360 });
this.mesh360 = new THREE.Mesh(geometry, material);
this.scene360.add(this.mesh360);
// renderer
this.renderer360 = new THREE.WebGLRenderer({ antialias: false });
this.renderer360.setClearColor(0x101010);
this.renderer360.setPixelRatio(window.devicePixelRatio);
this.renderer360.setSize(this.width, this.height, true);
๋๋ ์ด๊ฒ์ ํ๊ณ ์๋ค. ๋๋ ์ด๊ฒ์ด ์ ํํ ํฌ๊ธฐ๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค๊ณ ๊ฝค ํ์ ํ๋ค.
video.addEventListener("loadeddata", function() {
video.width = THREE.Math.ceilPowerOfTwo(video.videoWidth);
video.height = THREE.Math.ceilPowerOfTwo(video.videoHeight);
image.width = video.width;
image.height = video.height;
//image.width = video.videoWidth;
//image.height = video.videoHeight;
//imageContext.fillRect( 0, 0, video.videoWidth, video.videoHeight);
imageContext.fillRect( 0, 0, image.width, image.height);
//console.log(video.videoWidth);
});
๊ทธ๋์ ์กฐ๊ธ ์ฐ๋ฌ๋ณธ ํ ์ฐ์ด๋ดค์ต๋๋ค. ์ฐ๋ฆฌ ๊ตฌ์ฑ์์ ์คํ ๋ ์บ๋ฒ์ค๋ ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋ง๋๊ธฐ ์ํด ์ฌ์ ์ค์ธ ํ์ฌ HLS ๋ณํ์ ์ ํํ ํฌ๊ธฐ์ฌ์ผ ํ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค(๋ฐ๋ผ์ ABR์ ๊ฒฝ์ฐ ๋ณํ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ ๋ฐ์ดํธํด์ผ ํจ). ์ฐ๋ฆฌ์ ํ ์คํธ๋ ์ด๊ฒ์ด iOS 11์์ ์ ์์ ์ผ๋ก ์๋ํ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ๋ค๋ฅธ ์ฌ๋์๊ฒ ๋์์ด๋๋ค๋ฉด ์ฌ๊ธฐ์ ๋จ๊ฒจ ๋์ญ์์ค.
์, ๋ฐ๋ผ์ ๋น๋์ค ๋๋น๋ฅผ ์ป๊ธฐ ์ํด loaddata ์ด๋ฒคํธ์์ ์ํํฉ๋๋ค. ๋๋ ์ด๊ฒ์ ์ ์ ์์ ๋๊ณ ๋น์ ๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ์์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ธฐ๋ณธ HLS์ ๊ฒฝ์ฐ ๋นํธ ์ ์ก๋ฅ ์ด ๋ณ๊ฒฝ๋ ๋ ์ด๋ฒคํธ๊ฐ ์์ต๋๋ค. ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ํ ๋ฒ๋ง ์ค์ ํฉ๋๋ค. Apple์ ์ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์์ ์ด๋ฏธ ๋ฏฟ์ ์ ์์ ์ ๋๋ก ๋ง์ต๋๋ค.
ABR HLS์ ๋ํ ๋ณํ ๋ณ๊ฒฝ์ ๊ฐ์งํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ Safari์์ ์ ๊ณตํ๋ ์ด๋ฒคํธ๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋จ์ง ๊ฐ AnimationFrame์ video.videoWidth ๋ฐ video.videoHeight๋ฅผ ์ฌ์ฉํ์ฌ ์คํ๋ ์บ๋ฒ์ค ๋๋น์ ๋์ด๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค(์ฑ๋ฅ ๊ด์ ์์๋ ์ด์์ ์ด์ง ์์ ์ ์์ง๋ง ์ด ๋จ๊ณ์์๋ ์๋ํ๊ฒ ํ๊ณ ๋ค๋ฅธ ๋๊น์ง ํด๊ฒฐํ ๊ฒ์ ๋๋ค. ์ต์ ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค). ์ฐ๋ฆฌ์ ํ ์คํธ๋ ์๋ก์ด ๋ณํ์ด ํ์๋ ๋ video.videoWidth ๋ฐ video.videoHeight๊ฐ ๊ทธ์ ๋ฐ๋ผ ์ ๋ฐ์ดํธ๋์ด์ผ ํจ์ ๋ณด์ฌ์ค๋๋ค.
๋ค, ๊ทธ๋งํ ๊ฐ์น๊ฐ ์๋ ๋งํผ ์ถฉ๋ถํ ํดํนํ ์ ์์ต๋๋ค. ํนํ ํ๋ ์ ์ฝ๋ฐฑ์ ์กฐ๊ฑด๋ฌธ์ด ์๋ ๊ฒฝ์ฐ ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ ๊ณผ๋ํฉ๋๋ค. ์ง๊ธ์ ๋ฌด์์ด๋ ํจ๊ณผ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ฌ์ ํ ๋ณํ ๋ณ๊ฒฝ ์ด๋ฒคํธ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. ํ๋์ ๋ํ ์ฌ์์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง ๊ตฌํ๋์ง ์์์ต๋๊น?
์ด์ Safari ๋ฒ๊ทธ, HLS ํ๋ฆฌํผ ์์ ์ฌํญ์ ํด๊ฒฐํ๊ธฐ ์ํ CORS ํ๋ก์, ์ด์ ์ด๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค.
๋ชจ๋ ์ ์๋ํฉ๋๋ค. ๋๋ ์ข์ ๋ฌ ์ ๋ ๋์ ๋ด ํฐ์ผ์์ ์์ง ์ ๋ฐ์ดํธ๋ฅผ ๋ณด์ง ๋ชปํ์ต๋๋ค.
HTML5 ๋น๋์ค ์ฌ์์์ ํ์ง ์ ํ ์ด๋ฒคํธ์ ๋ํ ๋ด์ฉ์ ๋ณธ ๊ธฐ์ต์ด ์์ต๋๋ค. Apple์์ ์ ์ง ๊ด๋ฆฌํ๋ HLS ์ฌ์์ด ์์ง๋ง ํ์ง ์ ํ์ด ๋ฐ์ํ ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ํํด์ผ ํ๋ ์์ ์ ๋ํด์๋ ์ค๋ช ํ์ง ์์ต๋๋ค. hls.js์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์ด๋ฅผ ๊ตฌํํ์ง๋ง HLS์์ Safari์ ๊ธฐ๋ณธ HTML5 ๋น๋์ค์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ณ ์ ๋ ๊ฐ๊ฒฉ์ผ๋ก video.videoWidth๋ฅผ ์ฟผ๋ฆฌํ๊ณ ๋ณ๊ฒฝ์ด ๊ฐ์ง๋๋ฉด ํฌ๊ธฐ ์กฐ์ ์ฝ๋ฐฑ์ ํธ์ถํ์ฌ ๋ณํ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ธฐ ์ํด ํดํน์ "ํด๋ฆฌํ"ํ ์ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ์ด๊ฒ์ ๋ ๊ณผ์ธ๋ฉ๋๋ค. ๋๋ ์๋ง๋ ์ด๊ฒ์ ์ฐ๋ฆฌ ํ๋ ์ด์ด์ ๋์ค ๋จ๊ณ์์ ๊ตฌํํ ๊ฒ์ ๋๋ค.
@radiantmediaplayer "ํฌ๊ธฐ ์กฐ์ " ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ .videoWidth ๋ฐ .videoHeight ์์ฑ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์งํ ์ ์์ด์ผ ํฉ๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ ์ฌ๊ธฐ ๋ด ์๊ฒฌ์ ์ฐธ์กฐํ์ญ์์ค. ์๋ ์ค์ ๋๋ค.
ํ ์คํธ๋ฅผ ํ๊ณ ๋์์ ๊ฑฐ์น๋ ๊ฒ์ด ์ผ๋ง๋ ์๋ จ์ด์๋์ง. ์ ์ ํ ํผ๋๋ฐฑ์ด๋ ์๋ต์ ์ป์ง ๋ชปํ ๋ฟ์ ๋๋ค. ๋ ์ฌ๊ฐํ๊ฒ ๋๋ฌ์ด! ๋ ์ด์ ํ๊ทํ์ง ๋ง์ญ์์ค !!
OSX 11.3 ๋ฒ ํ๋ฅผ ์ค์นํ๋ฉด ์๋ํฉ๋๋ค. ์ด์ OSX 11์ ์ํํธ์จ์ด ๋ ๋๋ง์ด ํ์ํ๊ณ OSX 10์ flipY ๋ฐ ์์ ์์ ์ด ํ์ํฉ๋๋ค. ๋ณต์กํ ํธํ์ฑ ํผ๋๊ณผ ํ๋ซํผ ๋ฒ์ ๊ฐ์ง๊ฐ ํ์ํฉ๋๋ค.
Safari macOS์๋ ์ฌ์ ํ FlipY ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ๋ณ๋์ ํฐ์ผ์ ์๋ต์ด ์์ต๋๋ค. ๋ด PC ์ํฌ์คํ ์ด์ ์ macOS๋ฅผ ์ค์นํ๋ ค๊ณ ์๋ํ ์ ์์ ๋๊น์ง ์ด์จ๋ HLS๋ฅผ ์ ๋๋ก ํ ์คํธํ ์ ์์ต๋๋ค. HLS๋ vmware์์ ์ฌ์๋์ง ์์ต๋๋ค.
FlipY ํด๊ฒฐ ๋ฐฉ๋ฒ์ OSX 11.3์์๋ ํ์ํ์ง ์์ง๋ง ์ด์ ์ ์ธ๊ธํ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค์์ ์ด์ CORS๋ก ์์ํ๋ ์ ์ฒด IOS ๋ฐ Safari ํธํ์ฑ ๊ฒ์ฌ์ ๋๋ค.
๋ง์์ด ํ๋ค๋ฆฝ๋๋ค. ์ด๊ฑด ๋ฏธ์ณค์ด. ๋๋ ๋ฏธ๋๋ฅผ ์ฆ๋ช ํด์ผ ํ๊ณ IOS 12๋ณด๋ค ๋ ๋ง์ ๊ฒ์ ํฌํจํด์ผ ํ์ต๋๋ค.
ํตํฉ ์์ ์ค์ ๋๋ค! ์์ง macOS์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
static get supportsCORS() {
let testVideo = document.createElement("video"),
hasCORS = false,
userAgent = navigator.userAgent;
testVideo.crossOrigin = "anonymous";
hasCORS = testVideo.hasAttribute("crossOrigin");
testVideo = null;
if (hasCORS) {
//if (_isSafari = WebVRUtils.safariCheck(userAgent)) {
//Safari still reports CORS support regardless a bug
if (_isSafari) {
return WebVRUtils.isNewSafari(userAgent);
}
//cors support check for IE 11 support.
_corsSupported = true;
return true;
}
return false;
}
static isNewSafari(userAgent) {
const osxVersion = /Mac OS X (10[\.\_\d]+)/.exec(userAgent);
if (osxVersion) {
//check for safari test to fix HLS problems.
// _olderSafari = _browserVersion.match(/(\d+).(\d+).?(\d+)?/)[1] <= 10;
const version = osxVersion[1].split("_")[1];
return +version >= 12;
}
return WebVRUtils.isNewIOS(userAgent);
}
static isNewIOS(userAgent) {
const platform = navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/),
version = +platform[1];
_isLatestIOS = version >= 11;
//if greater than 11.3 or 12
_iOSHlsSupported = (_isLatestIOS && +platform[2] >= 3 || version >= 12);
return _isLatestIOS;
}
์ฉ๋ฒ
set hls(value) {
//if had a HLS source and the current playlist source isn't clear scene and revert the material.
if (this.hasHls && this.isSafari && !value) {
this.clearScene();
this.initScene(value);
}
//flipY fix
this.hasHls = value && this.isSafari;
//IOS10 colour inversion fix
this.invertHLS = this.isIpad;
//if we have hls and IOS 11 or greater
if (this.hasHls && WebVRUtils.isLatestIOS) {
//IOS 11.3 or greater disable flipY and colour inversion fixes
if (WebVRUtils.iOSHlsSupported) {
this.hasHls = false;
this.invertHLS = false;
} else {
//anything below IOS 11.3 use software rendering
this.config.software = true;
}
}
}
๋ง์ง๋ง์ผ๋ก ์ค์ํ ์ ์ ์์ ํฉ๋๋ค. IOS HLS ๋ ๋๋ง ๊ตฌํ์ ์ ๋ฐ๋์์ ์คํ๋๊ณ ์์ผ๋ฉฐ ๋งค์ฐ ๋ฏผ๊ฐํฉ๋๋ค. ๋ ๋๋ง์ loaddata ํ์ ์์ํด์ผ ํฉ๋๋ค.
teximage2d ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๋ ์ด์ ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์๊ณ ๊ฒ์์ ๋ ๋๋ง๋ง ๋ฐ์ํ๋ฉฐ ์์ ์ฌํญ์ด ๋ฐ์ํ์ง ์์ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
๋น๋์ค ๋ฐ์ดํฐ๊ฐ ์๋ ์ฆ์ ๋ ๋๋ง์ด ์์๋๋ฉด ๊ด์ฐฎ์ต๋๋ค. 11.3 ์ด์ ์๋ ๋ฌธ์ ๊ฐ ๋์ง ์์์ต๋๋ค.
๋น๋์ค๊ฐ ๋ค์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค(์์ ์บ๋ฒ์ค ์์ ์์ด). ์ต์ ios ๋ฒ์ 11.3(iphone 6s, 7์์ ํ ์คํธ)์ ํ์ธํ์ต๋๋ค.
์, 2์ 15์ผ์ ์ ๋ฐ์ดํธํ ๊ฒ ๊ฐ์ต๋๋ค. 11.3์์ ๋ค์ ์์ ์ค์ ๋๋ค. ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์ด ์์ต๋๋ค. ๋๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋ค์ ํ์ธํด์ผํ๊ณ ์๋ํ์ต๋๋ค!
iOS 11.3(๋ฐ ์ด์ ์์ํ๋ macOS ๋ฆด๋ฆฌ์ค)์์ ๋น๋์ค -> ํ ์ค์ฒ์ ๊ด๋ จ๋ ๋ง์ ๋ฌธ์ ๋ฅผ ์์ ํ์ต๋๋ค. ๋ฒ๊ทธ๋ฅผ ๋ซ๊ฑฐ๋ ์ ๋ฐ์ดํธํ์ง ์์๋ค๋ฉด ์ฃ์กํฉ๋๋ค.
์ฌ์ ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์๋ ค์ฃผ์ธ์. ๋๋ ์ง์ ์คํธ๋ฆผ(์: mp4)๊ณผ HTTP ๋ผ์ด๋ธ ์คํธ๋ฆผ์ด ๋ชจ๋ ์๋ํด์ผ ํ๋ฉฐ ํ๋ฆฌํผ๊ฐ ์ ํํ๊ฒ ๋ฐ์๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ๊ณ ๊ฐ ์ ์๋ 2์๋ถํฐ ๋ชจ๋ ์๋ฃ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์๋ ์๋ ์ธ์ ๊ฐ ๋ณด๊ณ ํ๋ค. ๋ฌด์์๋ก IOS ๋ฒ ํ๋ฅผ 11.3์ผ๋ก ์ ๋ฐ์ดํธํ๊ณ ์๋์ ์์ํ์ต๋๋ค. ์์ ํธํ์ฑ ๊ฒ์ฌ ์ฝ๋๋ ์ฌ๋ฌ ํ๋ซํผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฒ๋ฆฌํ๋ ๋ฐ ํ์ํฉ๋๋ค.
IOS 10์๋ flipY ์์ ์ด ํ์ํฉ๋๋ค. IOS 11.0 - 11.2์๋ ์ํํธ์จ์ด ๋ ๋๋ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. 11.3 > ์ ์์ ์ผ๋ก ๋ ๋๋งํ ์ ์์ต๋๋ค.
๋๊ตฌ๋ ์ง ์ด์ ๋ํ ์์ ์ํ, jsfiddle ๋ฑ์ ๊ณต์ ํ ์ ์์ต๋๊น? IOS 11 Safari์์ ์ฌ์ ํ ๊ฒ์์ ํ๋ฉด์ ๋ณผ ์ ์์์ต๋๋ค. ์ค๋์ค๋ ๋ค์ ์ ์์ง๋ง HLS ์คํธ๋ฆฌ๋ฐ์ ๋ํ ๋น๋์ค๋ ๋ค๋ฆฌ์ง ์์ต๋๋ค.
@dhanishapa iOS ๋ฒ์ ์ด ๋ฌด์์ ๋๊น? 11.3+์ธ๊ฐ์?
์กฐ๊ธ ์ (~ 2018๋ 5์) ์ ๋ HLS(? <= 11.2)์์ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฒฝํํ์ต๋๋ค.
Vimeo์ ์ฐ๋ฝํ ํ(์ ๋ HLS ์๋น์ค๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค) Apple ๊ฐ๋ฐ ํ์ ์ฐ๋ฝํ์ฌ ๋ฌธ์ ๋ฅผ ํจ๊ป ํด๊ฒฐํ ์ ์์์ต๋๋ค.
Apple ๊ฐ๋ฐ ํ์ผ๋ก๋ถํฐ ๊ทํ๊ฐ ๋ณด๊ณ ํ ์ฌ์ ๋ฌธ์ ์ ๋ํ ์์ ์ฌํญ์ด ํฌํจ๋ ์ ๋ฒ์ ์ iOS(11.3.1)๊ฐ ์ถ์๋์๋ค๋ ์์์ ๋ฐฉ๊ธ ๋ฐ์์ต๋๋ค. ์์ ์ฌํญ์ ๋น๋์ค๊ฐ ๊ฒ์ ํ๋ฉด์์ ์ค์ง๋๊ฑฐ๋ ๋น๋์ค ์ธ๊ทธ๋จผํธ๊ฐ ๋ฐ๋ณต๋๊ฑฐ๋ ๋ฌดํ ๋ก๋ ์ํ์ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ๋ฐฉ์งํด์ผ ํฉ๋๋ค.
์ ๋ก๋ํ๋ ๋์ H264๋ก ์ธ์ฝ๋ฉ๋ MP4๋ฅผ ์์ค๋ก ์ ๊ณตํ์ ๋ 11.3.1 ๋ฏธ๋ง์ iOS ๋ฒ์ ์์ ์ฌ์ ๋ฌธ์ ๊ฐ ์ฌ๋ผ์ก๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ์ ๋ก๋ํ๋ ๋์ Quicktime์ ์ ๋ ฅ ํ์์ผ๋ก ์ฌ์ฉํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๊ฐ ๋น๋์ค ํ์ผ์ ์ํด ์์ฑ๋ ๋งค๋ํ์คํธ ๊ฐ์ ๋ช ๊ฐ์ง ์ฐจ์ด์ ์ ๋ฐ๊ฒฌํ์ต๋๋ค(๋น๋์ค ์ฝ๋ฑ ์ฆ, ์๋ํ๋ ๋น๋์ค ์ฝ๋ฑ์ "avc1.64001E,mp4a.40.2" ๋ ์๋ํ์ง ์๋ ๋น๋์ค ์ฝ๋ฑ "hvc1.2.4.L63.90,mp4a.40.2"). ).
์๋ง๋ ์ด ์ ๋ณด๋ ๋๊ตฌ์๊ฒ๋ ์ ์ฉํ ๊ฒ์ ๋๋ค.
์๋
ํ์ธ์
IOS ์ฌํ๋ฆฌ์์ HLS ์คํธ๋ฆฌ๋ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
cors ํ๋ก์๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ธฐ๋ณธ hls ํ๋ ์ด์ด์ html5 ํ๋ ์ด์ด๋ฅผ ์ฌ์ฉํด ๋ณด์๊ณ IOS์์ ์ง์ m3u8 ๋งํฌ๋ฅผ ์ฌ์ํ๋ ค๊ณ ์๋ํ์ง๋ง ์๋ํ์ง ์๋ ๋ฐ๋ฉด ์ฌํ๋ฆฌ(๋ฐ์คํฌํฑ - ๋งฅ), ํฌ๋กฌ, ํ์ด์ดํญ์ค์์๋ ์๋ํ์ง ์๊ณ IOS(์์ดํฐ)์์๋ ์๋ํ์ง ์์ต๋๋ค.
cors๋ IOS 11.0์์ ์์ ๋์์ต๋๋ค. ๋ด๊ฐ ํด๊ฒฐํ ๋ค๋ฅธ ํฐ ์์ ์ฌํญ์ 11.3์ ์์ต๋๋ค. 11.3์ ์ง๊ธ ๋์์ผ ํฉ๋๋ค. ํ๋ก์๋ IOS 10 ๋ฐ 9์๋ง ํ์ํฉ๋๋ค.
๐๐ฝโโ๏ธ
๋ค์์ ๊ตฌ์ ๋งคํ๋ HLS ์คํธ๋ฆผ playhouse-vr์ 360๋ ๋น๋์ค ).
macOS v10.13.4 + Safari v11.1 ๋ฐ iOS 11.4.1 + Safari์์ ํ ์คํธ๋จ
์ด์ iOS 14.0 Safari ๋ฐ iPadOS 14.0 Safari์์ ์๋ก์ด ๊ฒ์์ ํ๋ฉด ๋ฌธ์ ๊ฐ ํ์๋ฉ๋๋ค. ๋๊ฐ์ ํ๋ ์ด์ด๊ฐ iOS 13.7 Safari ๋ฐ iPadOS 13.7 Safari์์ ์๋ํฉ๋๋ค. three.js r120(r116์์)์ผ๋ก ์ ๋ฐ์ดํธ๋ฅผ ์๋ํ์ง๋ง ์์ฉ์ด ์์์ต๋๋ค. macOS Safari 14๋ ๊ด์ฐฎ์ต๋๋ค. ๊ฐ์ ๊ฒ์ ๋ณด๊ณ ์๋ ์ฌ๋์ด ์์ต๋๊น? iOS 14๋ฅผ ์ง์ํ๊ธฐ ์ํ ๋ค์ ๋จ๊ณ์ ๋ํ ํํธ๊ฐ ์์ต๋๊น?
์, iOS 14 ํ๊ท์ ๋ํด https://bugs.webkit.org/show_bug.cgi?id=215908 ๋ฐ https://bugs.webkit.org/show_bug.cgi?id=216250 ์ ๋ชจ๋ ํ์ธํ์ญ์์ค. ๋ง์ ์ฌ์ดํธ๊ฐ ์ํฅ์ ๋ฐ์ ์ ์์ผ๋ฏ๋ก ์ด ๋ ๊ฐ์ง๊ฐ ๋ชจ๋ ๋นจ๋ฆฌ ํด๊ฒฐ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
Safari์์ ๋์๋ ์ ํฌ์ ๋๋ค. ๋๋ ๋ด ์์ ์ 360๋ ๊ธฐ๋ฅ์ ๋ํ ๋ถ๋ง์ ๋ค์ ๊ธฐ๋ํฉ๋๋ค. ๊ทธ๊ฒ๋ค์ ๊ณ ์น๋ ๋ฐ ๋งค๋ฒ ๋ช ๋ฌ์ด ๊ฑธ๋ฆฝ๋๋ค. ์์ ์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๋ค. ๊ทธ๋์ ๋ ๋ง์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์ ์๊ฐ์ ๋๋ค!! Webkit์ HLS๋ฅผ ํ ์คํธํ์ง ์์ผ๋ฉฐ WebGL์ ๋ํ HLS ํ ์คํธ๊ฐ ์์ผ๋ฏ๋ก ์ง์ ๋ง๋ค์ด์ผ ํ์ต๋๋ค.
๋ด ๊ธฐ๋ฅ์์ ๋ค๋ฅธ IOS์ ๋ํ ๋ชจ๋ ๋ถํ๋ ค์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ๊ฑฐํ์ต๋๋ค. ํ์ง๋ง ๊ทธ ์ค ํ๋๋ 11.0์ฉ ์บ๋ฒ์ค ์ํํธ์จ์ด ๋ ๋๋ง์ ์ฌ์ฉํด์ผ ํ์ต๋๋ค... ์ฌ์ ํ ํ๋ซํผ ํ์ธ์ ํด์ผ ํฉ๋๋ค. IOS 13์์๋ ์ด์ ํ๋ซํผ ๊ฒ์ฌ๊ฐ ์ค๋จ๋์์ต๋๋ค. ๋๋ ํ์ง ํ๋ก์ ํธ์์ ๊ทธ๊ฒ์ ๊ณ ์ณ์ผ ํ๋ค. HLS๊ฐ ์ฆ์ ๋ ๋๋ง๋์ง ์๊ณ IOS 13์์ ์๊ฐ์ด ๊ฑธ๋ฆฌ์ง๋ง ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ ๋ค์ ํ์ธํด์ผ ํฉ๋๋ค.
๊ทธ๋ค์ ์๊ดํ์ง ์์ต๋๋ค. WebXR API๊ฐ ์์ผ๋ฉฐ Android์ ๊ฐ์ Wakelock API๊ฐ ๋ฐฉ๊ธ ๊ตฌํ๋์์ต๋๋ค.
๋ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ฐ๋ฅด๋ฉด ๋ณํ ๋ณ๊ฒฝ ์ ์ฌ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ถค๋ ์ ์ด์์ ํ๋/์ถ์๋ฅผ ๋นํ์ฑํํฉ๋๋ค. ์ด๊ฒ์ IOS 13์์ ๊ฒ์์ ๋ ๋๋ง์ ์ค์งํฉ๋๋ค. IOS 14๋ ํ์ธํด์ผ ํฉ๋๋ค.
video.addEventListener("resize", () => {
vrVideo.update();
vrVideo.fullScreenResize(false);
});
14.2๋ฅผ ํ ์คํธํ์ต๋๋ค. ์๊ฒ ์ต๋๋ค. ์์ ์์ ์ ๊ทธ๊ฒ์ ํ ๊ฒ์ ๋๋ค ...
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ด์ฅ ์ ฐ์ด๋๋ฅผ ํดํนํ๋ ๋์ ์ฌ์ฉ์ ์ง์ ์ ฐ์ด๋๋ฅผ ๋ง๋ค ๊ฒ์ ๋๋ค.
์! ๐
https://jsfiddle.net/9jy92zxn/