カメラモジュールとcamera.inoを用いてSDカードに画像を記録をしているのですが、1秒当たり2フレーム程度しか保存できません。30FPS程度でSDカードに記録できるようにするための方法を教えてください。よろしくお願いします。
CC BY-SA 4.0
2019-03-19T08:20:16.560
53548
2019-03-30T12:37:48.940
31278
question
spresense
Sony Spresenseの画像データのSDカードへの保存について
興味があったので、少し調べてみました。  
caemra.ino の静止画の撮影処理にかかる時間を調べてみると、次のような内訳になりました。

```

    takePicture :  330ms～ 
    OpenFile : 30ms
    WriteFile : 70ms～
    CloseFile : 10ms
    Total : 440ms～
    ※撮影したJPGのファイルサイズによって変動することに注意
    
```

静止画撮影に 330ms、ファイル処理に 110ms かかっています。

静止画撮影になんでこんなに時間がかかるのだろうと、takePicture の中身を見たら、次のように処理をしていました。

```

    ioctl(video_fd, VIDIOC_TAKEPICT_START, take_num) //カメラ開始
    ioctl_dequeue_stream_buf(&buf, V4L2_BUF_TYPE_STILL_CAPTURE) //写真撮影
    ioctl(video_fd, VIDIOC_TAKEPICT_STOP, false) //カメラ停止
    
```

つまり、静止画をとるたびにカメラを開始・停止をしていたのです。

なので、カメラを開始したまま連続撮影したらどうなるだろうと思い試してみました。  
次のような感じです。

```

    ioctl(video_fd, VIDIOC_TAKEPICT_START, take_num) //カメラ開始
    for (int i = 0; i < 30; ++i) {
      ioctl_dequeue_stream_buf(&buf, V4L2_BUF_TYPE_STILL_CAPTURE) //30枚連続写真撮影
    }
    ioctl(video_fd, VIDIOC_TAKEPICT_STOP, false) //カメラ停止
    
```

すると測定結果は次のようになりました。

```

    ioctl_dequeue_stream_buf:  90ms～ 
    OpenFile : 30ms
    WriteFile : 70ms～
    CloseFile : 10ms
    Total : 200ms～
    ※撮影したJPGのファイルサイズによって変動することに注意
    
```

期待したとおり、大分時間が縮まりました。5fps 位はなんとかなりそうです。

しかし 30fps を実現するには、静止画撮影に 15ms、ファイル処理に 15ms 程度しか割り当てられません。う～ん、静止画撮影の処理をベースに
30fps を実現するのは厳しそうですね。

動画なら時間方向の圧縮もあるので全体のデータ量が少なくなりますし、SDカードに連続的に書き込めますので、もっと早くなる可能性がありますが、残念ながら参考になりそうなコードは見つかりませんでした。

以上、ご参考になれば。（あまり参考にならないかも知れませんが…^^;）
CC BY-SA 4.0
2019-03-30T03:31:25.283
53816
2019-03-30T12:37:48.940
2019-03-30T12:37:48.940
27334
27334
53548
answer