obnizのフォーラムは新しいシステムに移行しております。

新しいフォーラムはこちらになります

Androidスマホカメラの動作保証スペック等はありますでしょうか?



  • Androidスマホにてブロックプログラミングをしています。

    カメラを使用したいのですが、「Cannot start camera on your device.」というメッセージが表示され使用できないようです。
    「Xperia SO-02G(Andriod Version 6.0.1)」という古い機種なので、
    対応していない可能性があると思っているのですが、
    動作保証されているスペック制限等はありますでしょうか?
    スマホ側でのカメラアプリの権限設定は許可している状態です。

    0_1571450157155_QA20191019.png

    尚、他にカメラ付きのモバイルやPCを持っていないため、
    別の機器での動作確認はできていません。

    コンソールログの表示内容は以下の通りです。

    09:49:22
    1 2 precision highp float; 3 precision highp int; 4 varying vec2 resultUV; 5 const vec2 halfCR = vec2(0.5, 0.5); 6 7 struct ivec5 8 { 9 int x; 10 int y; 11 int z;
    09:49:22
    Fragment shader compilation failed.
    09:49:22
    %c 12 int w;
    border:1px solid red; background-color:#e3d2d2; color:#a61717
    09:49:22
    13 int u; 14 }; 15 16 struct ivec6 17 { 18 int x; 19 int y; 20 int z; 21 int w; 22 int u; 23 int v; 24 }; 25 26 bool isNaN(float val) { 27 return (val < 1.0 || 0.0 < val || val == 0.0) ? false : true; 28 } 29 30 bool hasNaN(vec4 values) { 31 vec4 v1 = values * values; 32 vec4 v2 = values * values; 33 return any(notEqual(v1, v2)); 34 } 35 36 float getNaN(vec4 values) { 37 return dot(vec4(1), values); 38 } 39 40 int round(float value) { 41 return int(floor(value + 0.5)); 42 } 43 44 int imod(int x, int y) { 45 return x - y * (x / y); 46 } 47 48 //Based on the work of Dave Hoskins 49 //https://www.shadertoy.com/view/4djSRW 50 #define HASHSCALE1 443.8975 51 float random(float seed){ 52 vec2 p = resultUV * seed; 53 vec3 p3 = fract(vec3(p.xyx) * HASHSCALE1); 54 p3 += dot(p3, p3.yzx + 19.19); 55 return fract((p3.x + p3.y) * p3.z); 56 } 57 58 59 vec2 UVfrom1D(int texNumR, int texNumC, int index) { 60 int texR = index / texNumC; 61 int texC = index - texR * texNumC; 62 return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); 63 } 64 vec2 packedUVfrom1D(int texNumR, int texNumC, int index) { 65 int texelIndex = index / 2; 66 int texR = texelIndex / texNumC; 67 int texC = texelIndex - texR * texNumC; 68 return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); 69 } 70 71 72 vec2 UVfrom2D(int texNumR, int texNumC, int numC, int row, int col) { 73 int index = row * numC + col; 74 int texR = index / texNumC; 75 int texC = index - texR * texNumC; 76 return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); 77 } 78 vec2 packedUVfrom2D(int texelsInLogicalRow, int texNumR, 79 int texNumC, int row, int col) { 80 int texelIndex = (row / 2) * texelsInLogicalRow + (col / 2); 81 int texR = texelIndex / texNumC; 82 int texC = texelIndex - texR * texNumC; 83 return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); 84 } 85 86 87 vec2 UVfrom3D(int texNumR, int texNumC, int stride0, 88 int stride1, int row, int col, int depth) { 89 // Explicitly use integer operations as dot() only works on floats. 90 int index = row * stride0 + col * stride1 + depth; 91 int texR = index / texNumC; 92 int texC = index - texR * texNumC; 93 return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); 94 } 95 vec2 packedUVfrom3D(int texNumR, int texNumC, 96 int texelsInBatch, int texelsInLogicalRow, int b, 97 int row, int col) { 98 int index = b * texelsInBatch + (row / 2) * texelsInLogicalRow + (col / 2); 99 int texR = index / texNumC; 100 int texC = index - texR * texNumC; 101 return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); 102 } 103 104 105 vec2 UVfrom4D(int texNumR, int texNumC, int stride0, 106 int stride1, int stride2, int row, int col, int depth, 107 int depth2) { 108 // Explicitly use integer operations as dot() only works on floats. 109 int index = row * stride0 + col * stride1 + depth * stride2 + depth2; 110 int texR = index / texNumC; 111 int texC = index - texR * texNumC; 112 return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); 113 } 114 vec2 packedUVfrom4D(int texNumR, int texNumC, int texelsInBatch2, 115 int texelsInBatch, int texelsInLogicalRow, int b2, int b, 116 int row, int col) { 117 int index = b2 * texelsInBatch2 + b * texelsInBatch + 118 (row / 2) * texelsInLogicalRow + (col / 2); 119 int texR = index / texNumC; 120 int texC = index - texR * texNumC; 121 return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); 122 } 123 124 125 vec2 UVfrom5D(int texNumR, int texNumC, int stride0, 126 int stride1, int stride2, int stride3, int row, int col, int depth, 127 int depth2, int depth3) { 128 // Explicitly use integer operations as dot() only works on floats. 129 int index = row * stride0 + col * stride1 + 130 depth * stride2 + depth2 * stride3 + depth3; 131 int texR = index / texNumC; 132 int texC = index - texR * texNumC; 133 return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); 134 } 135 136 137 vec2 UVfrom6D(int texNumR, int texNumC, int stride0, 138 int stride1, int stride2, int stride3, int stride4, 139 int row, int col, int depth, int depth2, int depth3, int depth4) { 140 // Explicitly use integer operations as dot() only works on floats. 141 int index = row * stride0 + col * stride1 + depth * stride2 + depth2 * 142 stride3 + depth3 * stride4 + depth4; 143 int texR = index / texNumC; 144 int texC = index - texR * texNumC; 145 return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); 146 } 147 148 149 150 float sampleTexture(sampler2D textureSampler, vec2 uv) { 151 return texture2D(textureSampler, uv).r; 152 } 153 154 155 void setOutput(float val) { 156 gl_FragColor = vec4(val, 0, 0, 0); 157 } 158 159 uniform sampler2D source; 160 161 ivec4 getOutputCoords() { 162 ivec2 resTexRC = ivec2(resultUV.yx * 163 vec2(224, 672)); 164 int index = resTexRC.x * 672 + resTexRC.y; 165 int r = index / 150528; index -= r * 150528;int c = index / 672; index -= c * 672;int d = index / 3; int d2 = index - d * 3; 166 return ivec4(r, c, d, d2); 167 } 168 169 170 float getSourceFlat(int index) { 171 vec2 uv = UVfrom1D(224, 672, index); 172 return sampleTexture(source, uv); 173 } 174 175 176 float getSource(int row, int col, int depth) { 177 float texR = float(row); 178 float texC = dot(vec2(col, depth), vec2(3, 1)); 179 vec2 uv = (vec2(texC, texR) + halfCR) / 180 vec2(672.0, 224.0); 181 return sampleTexture(source, uv); 182 } 183 184 float getSource(int row, int col, int depth, int depth2) { 185 return getSource(col, depth, depth2); 186 } 187 188 float getSourceAtOutCoords() { 189 return sampleTexture(source, resultUV); 190 } 191 192 193 uniform ivec4 start; 194 195 void main() { 196 ivec4 sourceLoc = start + getOutputCoords(); 197 setOutput(getSource(sourceLoc.x, sourceLoc.y, sourceLoc.z, sourceLoc.w)); 198 } 199



  • @goose さん

    このブロックの動作条件としては

    1. フロントカメラが存在し、
    2. HTML5のgetUserMediaから使えること

    となります。

    1. HTML5のgetUserMediaから使えること

    gooseさんのデバイスですとこちらの条件が満たせていなく、エラーになっているようです。
    HTML5のgetUserMediaはfor androidですとandroid 7.0以降のchrome version52からサポートされており、Android7.0 のchrome version76にて動作確認をしています。



  • 具体的なご説明ありがとうございました。

    動作条件につき承知しました。

    今後ともよろしくお願いいたします。



SUGGESTED TOPICS