teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

8

コード修正

2022/01/06 15:29

投稿

jimbe
jimbe

スコア13352

answer CHANGED
@@ -23,8 +23,8 @@
23
23
  LOGD("%s", tmp);
24
24
 
25
25
  char filename[32];
26
- long temp_ms = 1000 * buffer.timestamp.tv_sec + (long) round(buffer.timestamp.tv_usec / 1000.0); //★追加
26
+ double temp_ms = 1000 * buffer.timestamp.tv_sec + (buffer.timestamp.tv_usec / 1000.0); //★追加
27
- sprintf(filename, "./%05d_%ld.raw", count++, temp_ms); //★ファイル名に時間を追加
27
+ sprintf(filename, "./%05d_%.2f.raw", count++, temp_ms); //★ファイル名に時間を追加
28
28
  //sprintf(filename, "/sdcard/%05d.raw", count++);
29
29
  //sprintf(filename, "./%05d.raw", count++); //★コメント化
30
30
  //sprintf(filename, "./%05d.raw", count);
@@ -44,7 +44,6 @@
44
44
  buffer->memory = V4L2_MEMORY_MMAP; //★
45
45
  buffer->index = BUFFER_COUNT; //★
46
46
  ret = ioctl(cam_fd, VIDIOC_DQBUF, buffer); //★
47
- clock_gettime(CLOCK_REALTIME, (struct timespec *)&buffer->timestamp); //☆
48
47
  if (ret != 0)
49
48
  {
50
49
  DBG("ioctl(VIDIOC_DQBUF) failed %d(%s)", errno, strerror(errno));
@@ -62,6 +61,8 @@
62
61
  DBG("copy done.");
63
62
 
64
63
  ret = ioctl(cam_fd, VIDIOC_QBUF, buffer); //★
64
+ clock_gettime(CLOCK_REALTIME, (struct timespec *)&buffer->timestamp); //☆
65
+ buffer->timestamp.tv_usec /= 1000; //ナノ->マイクロ補正
65
66
  if (ret != 0)
66
67
  {
67
68
  DBG("ioctl(VIDIOC_QBUF) failed %d(%s)", errno, strerror(errno));

7

コード修正

2022/01/06 15:29

投稿

jimbe
jimbe

スコア13352

answer CHANGED
@@ -43,8 +43,8 @@
43
43
  buffer->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; //★
44
44
  buffer->memory = V4L2_MEMORY_MMAP; //★
45
45
  buffer->index = BUFFER_COUNT; //★
46
- ret = ioctl(cam_fd, VIDIOC_DQBUF, buffer);//从?列中取出一? //★
46
+ ret = ioctl(cam_fd, VIDIOC_DQBUF, buffer); //★
47
- clock_gettime(CLOCK_REALTIME, &buffer->timestamp); //☆
47
+ clock_gettime(CLOCK_REALTIME, (struct timespec *)&buffer->timestamp); //☆
48
48
  if (ret != 0)
49
49
  {
50
50
  DBG("ioctl(VIDIOC_DQBUF) failed %d(%s)", errno, strerror(errno));
@@ -58,10 +58,10 @@
58
58
  }
59
59
 
60
60
  DBG("dequeue done, index: %d", buffer->index); //★
61
- memcpy(out_buffer, video_buffer_ptr[buffer->index], IMAGE_SIZE);//?冲?数据拷?出来 //★
61
+ memcpy(out_buffer, video_buffer_ptr[buffer->index], IMAGE_SIZE); //★
62
62
  DBG("copy done.");
63
63
 
64
- ret = ioctl(cam_fd, VIDIOC_QBUF, buffer);//?冲?放入?列 //★
64
+ ret = ioctl(cam_fd, VIDIOC_QBUF, buffer); //★
65
65
  if (ret != 0)
66
66
  {
67
67
  DBG("ioctl(VIDIOC_QBUF) failed %d(%s)", errno, strerror(errno));

6

clock_gettime 追加

2022/01/04 17:49

投稿

jimbe
jimbe

スコア13352

answer CHANGED
@@ -44,6 +44,7 @@
44
44
  buffer->memory = V4L2_MEMORY_MMAP; //★
45
45
  buffer->index = BUFFER_COUNT; //★
46
46
  ret = ioctl(cam_fd, VIDIOC_DQBUF, buffer);//从?列中取出一? //★
47
+ clock_gettime(CLOCK_REALTIME, &buffer->timestamp); //☆
47
48
  if (ret != 0)
48
49
  {
49
50
  DBG("ioctl(VIDIOC_DQBUF) failed %d(%s)", errno, strerror(errno));

5

バグ修正

2022/01/04 03:21

投稿

jimbe
jimbe

スコア13352

answer CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  char filename[32];
26
26
  long temp_ms = 1000 * buffer.timestamp.tv_sec + (long) round(buffer.timestamp.tv_usec / 1000.0); //★追加
27
- sprintf(filename, "./%05d_%g.raw", count++, temp_ms); //★ファイル名に時間を追加
27
+ sprintf(filename, "./%05d_%ld.raw", count++, temp_ms); //★ファイル名に時間を追加
28
28
  //sprintf(filename, "/sdcard/%05d.raw", count++);
29
29
  //sprintf(filename, "./%05d.raw", count++); //★コメント化
30
30
  //sprintf(filename, "./%05d.raw", count);

4

コードインデント修正

2022/01/01 12:24

投稿

jimbe
jimbe

スコア13352

answer CHANGED
@@ -12,7 +12,7 @@
12
12
  int count = 0;
13
13
  for(j=0;j<optcapcnt;j++)
14
14
  {
15
- struct v4l2_buffer buffer; //★追加
15
+ struct v4l2_buffer buffer; //★追加
16
16
  ret = cam_get_image(buf, IMAGE_SIZE, &buffer); //★パラメータ追加
17
17
  //ret = cam_get_image(buf, IMAGE_SIZE);
18
18
  ASSERT(ret==0);

3

修正例コード追加

2021/12/29 13:59

投稿

jimbe
jimbe

スコア13352

answer CHANGED
@@ -1,1 +1,73 @@
1
- cam_get_image のローカルで用意している struct v4l2_buffer buffer を外から渡すようにして、そのタイムスタンプをファイル名を作っている sprintf で使うと良さそうですね。
1
+ cam_get_image のローカルで用意している struct v4l2_buffer buffer を外から渡すようにして、そのタイムスタンプをファイル名を作っている sprintf で使うと良さそうですね。
2
+
3
+ ----
4
+ 以下のような感じです。
5
+
6
+ ※コンパイルもしていません!!
7
+
8
+ main 書き換え(cam_get_image に struct v4l2_buffer をパラメータとして渡し、中の情報でファイル名を構成する)
9
+ ```c
10
+ (略)
11
+ while (1) {
12
+ int count = 0;
13
+ for(j=0;j<optcapcnt;j++)
14
+ {
15
+ struct v4l2_buffer buffer; //★追加
16
+ ret = cam_get_image(buf, IMAGE_SIZE, &buffer); //★パラメータ追加
17
+ //ret = cam_get_image(buf, IMAGE_SIZE);
18
+ ASSERT(ret==0);
19
+
20
+ char tmp[64] = {"---\n"};
21
+ for (i=0; i<16; i++)
22
+ sprintf(&tmp[strlen(tmp)], "%02x ", buf[i]);
23
+ LOGD("%s", tmp);
24
+
25
+ char filename[32];
26
+ long temp_ms = 1000 * buffer.timestamp.tv_sec + (long) round(buffer.timestamp.tv_usec / 1000.0); //★追加
27
+ sprintf(filename, "./%05d_%g.raw", count++, temp_ms); //★ファイル名に時間を追加
28
+ //sprintf(filename, "/sdcard/%05d.raw", count++);
29
+ //sprintf(filename, "./%05d.raw", count++); //★コメント化
30
+ //sprintf(filename, "./%05d.raw", count);
31
+ int fd = open(filename,O_WRONLY|O_CREAT,00700);//保存?像数据
32
+ (略)
33
+ ```
34
+ cam_get_image 書き換え(struct v4l2_buffer をパラメータとして受け取る)
35
+ ```c
36
+ //int cam_get_image(u8* out_buffer, int out_buffer_size)
37
+ int cam_get_image(u8* out_buffer, int out_buffer_size, struct v4l2_buffer *buffer) //★
38
+ {
39
+ int ret;
40
+ //struct v4l2_buffer buffer; //★
41
+
42
+ memset(buffer, 0, sizeof(struct v4l2_buffer)); //★
43
+ buffer->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; //★
44
+ buffer->memory = V4L2_MEMORY_MMAP; //★
45
+ buffer->index = BUFFER_COUNT; //★
46
+ ret = ioctl(cam_fd, VIDIOC_DQBUF, buffer);//从?列中取出一? //★
47
+ if (ret != 0)
48
+ {
49
+ DBG("ioctl(VIDIOC_DQBUF) failed %d(%s)", errno, strerror(errno));
50
+ return ret;
51
+ }
52
+
53
+ if (buffer->index < 0 || buffer->index >= BUFFER_COUNT) //★
54
+ {
55
+ DBG("invalid buffer index: %d", buffer->index); //★
56
+ return ret;
57
+ }
58
+
59
+ DBG("dequeue done, index: %d", buffer->index); //★
60
+ memcpy(out_buffer, video_buffer_ptr[buffer->index], IMAGE_SIZE);//?冲?数据拷?出来 //★
61
+ DBG("copy done.");
62
+
63
+ ret = ioctl(cam_fd, VIDIOC_QBUF, buffer);//?冲?放入?列 //★
64
+ if (ret != 0)
65
+ {
66
+ DBG("ioctl(VIDIOC_QBUF) failed %d(%s)", errno, strerror(errno));
67
+ return ret;
68
+ }
69
+ DBG("enqueue done.");
70
+
71
+ return 0;
72
+ }
73
+ ```

2

修正

2021/12/29 13:53

投稿

jimbe
jimbe

スコア13352

answer CHANGED
@@ -1,1 +1,1 @@
1
- cam_get_image のローカルで用意している buffer を外から渡すようにして、そのタイムスタンプをファイル名を作っている sprintf で使うと良さそうですね。
1
+ cam_get_image のローカルで用意している struct v4l2_buffer buffer を外から渡すようにして、そのタイムスタンプをファイル名を作っている sprintf で使うと良さそうですね。

1

回答のコメントにするつもりが間違えたので修正

2021/11/20 13:05

投稿

jimbe
jimbe

スコア13352

answer CHANGED
@@ -1,1 +1,1 @@
1
- v4l2_buffer に入っているというタイムスタンプを使ったほうがより raw っぽいですので、 cam_get_image のローカルで用意している buffer を外から渡して、そを sprintf で使うと良さそうですね。
1
+ cam_get_image のローカルで用意している buffer を外から渡すようにして、そのタイムスタンプファイル名を作っている sprintf で使うと良さそうですね。