ffmpegからiSightカメラを呼ぶには
まず次のコマンドでiSightカメラのデバイス番号を確認します。なお、 -hide_banner オプションを付記すると、ffmpeg実行の度に冒頭に現れるバージョン情報を抑制することが出来ます。
1 2 3 4 5 6 7 8 9 10 |
$ ffmpeg -hide_banner -f avfoundation -list_devices true -i "" [AVFoundation indev @ 0x7fe4cae075c0] AVFoundation video devices: [AVFoundation indev @ 0x7fe4cae075c0] [0] Display iSight [AVFoundation indev @ 0x7fe4cae075c0] [1] Capture screen 0 [AVFoundation indev @ 0x7fe4cae075c0] [2] Capture screen 1 [AVFoundation indev @ 0x7fe4cae075c0] AVFoundation audio devices: [AVFoundation indev @ 0x7fe4cae075c0] [0] Built-in Line Input [AVFoundation indev @ 0x7fe4cae075c0] [1] Built-in Digital Input [AVFoundation indev @ 0x7fe4cae075c0] [2] Display Audio : Input/output error |
上記結果の [0] Display iSight から、デバイス番号が確認できたので早速、静止画撮影してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
macpro:Pictures user$ ffmpeg -hide_banner -f avfoundation -video_size 1280x1024 -framerate 30 -i "0" -vframes 1 out.jpg [avfoundation @ 0x7fbfde507880] Selected pixel format (yuv420p) is not supported by the input device. [avfoundation @ 0x7fbfde507880] Supported pixel formats: [avfoundation @ 0x7fbfde507880] uyvy422 [avfoundation @ 0x7fbfde507880] yuyv422 [avfoundation @ 0x7fbfde507880] nv12 [avfoundation @ 0x7fbfde507880] 0rgb [avfoundation @ 0x7fbfde507880] bgr0 [avfoundation @ 0x7fbfde507880] Overriding selected pixel format to use uyvy422 instead. [avfoundation @ 0x7fbfde507880] Stream #0: not enough frames to estimate rate; consider increasing probesize Input #0, avfoundation, from '0': Duration: N/A, start: 7879123.236333, bitrate: N/A Stream #0:0: Video: rawvideo (UYVY / 0x59565955), uyvy422, 1280x1024, 1000k tbr, 1000k tbn Stream mapping: Stream #0:0 -> #0:0 (rawvideo (native) -> mjpeg (native)) Press [q] to stop, [?] for help [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfde81f200] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfde868a00] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfde8b2200] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfde8fba00] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfde945200] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfde98ea00] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfde9d8200] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfdea21a00] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfdea6b200] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfdeab4a00] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfdeafe200] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfdeb47a00] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfdeb91200] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfdebdaa00] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfdec24200] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfdec6da00] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfdecb7200] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfded00a00] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfded4a200] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfded93a00] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfdeddd200] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfdee26a00] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfdee70200] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfdeeb9a00] deprecated pixel format used, make sure you did set range correctly [swscaler @ 0x7fbfe0007800] [swscaler @ 0x7fbfdef03200] deprecated pixel format used, make sure you did set range correctly [image2 @ 0x7fbfdfe02f80] Frame rate very high for a muxer not efficiently supporting it. Please consider specifying a lower framerate, a different muxer or -vsync 2 Output #0, image2, to 'out.jpg': Metadata: encoder : Lavf59.9.100 Stream #0:0: Video: mjpeg, yuvj422p(pc, progressive), 1280x1024, q=2-31, 200 kb/s, 1000k fps, 1000k tbn Metadata: encoder : Lavc59.12.100 mjpeg Side data: cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A frame= 1 fps=0.0 q=6.0 Lsize=N/A time=00:00:00.00 bitrate=N/A speed=3.5e-05x video:51kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown |
JPG画像も正常に出力されましたが、少しターミナルに吐かれたメッセージが多いので、順に追いながらオプションの改善を図ります。
その前に、撮影に使用した基本的なオプションは次の3つ、
-video_size 1280×1024
これは入力デバイスの解像度なので、-i “0”という入力デバイスオプションよりも前に記述しないと効きません。
-framerate 30
今回は静止画取得なので、このオプションは要らないのではと勘違いして、フレームレートを指定しないで実行すると、次のように怒れられます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
[avfoundation @ 0x7fa7fe507840] Selected framerate (29.970030) is not supported by the device. [avfoundation @ 0x7fa7fe507840] Supported modes: [avfoundation @ 0x7fa7fe507840] 160x120@[30.000030 30.000030]fps [avfoundation @ 0x7fa7fe507840] 160x120@[27.500028 27.500028]fps [avfoundation @ 0x7fa7fe507840] 160x120@[25.000000 25.000000]fps [avfoundation @ 0x7fa7fe507840] 160x120@[22.500023 22.500023]fps [avfoundation @ 0x7fa7fe507840] 160x120@[20.000000 20.000000]fps [avfoundation @ 0x7fa7fe507840] 160x120@[17.500018 17.500018]fps [avfoundation @ 0x7fa7fe507840] 160x120@[14.999993 14.999993]fps [avfoundation @ 0x7fa7fe507840] 160x120@[12.500000 12.500000]fps [avfoundation @ 0x7fa7fe507840] 160x120@[10.000000 10.000000]fps [avfoundation @ 0x7fa7fe507840] 160x120@[7.500002 7.500002]fps [avfoundation @ 0x7fa7fe507840] 160x120@[5.000000 5.000000]fps [avfoundation @ 0x7fa7fe507840] 176x144@[30.000030 30.000030]fps [avfoundation @ 0x7fa7fe507840] 176x144@[27.500028 27.500028]fps [avfoundation @ 0x7fa7fe507840] 176x144@[25.000000 25.000000]fps [avfoundation @ 0x7fa7fe507840] 176x144@[22.500023 22.500023]fps [avfoundation @ 0x7fa7fe507840] 176x144@[20.000000 20.000000]fps [avfoundation @ 0x7fa7fe507840] 176x144@[17.500018 17.500018]fps [avfoundation @ 0x7fa7fe507840] 176x144@[14.999993 14.999993]fps [avfoundation @ 0x7fa7fe507840] 176x144@[12.500000 12.500000]fps [avfoundation @ 0x7fa7fe507840] 176x144@[10.000000 10.000000]fps [avfoundation @ 0x7fa7fe507840] 176x144@[7.500002 7.500002]fps [avfoundation @ 0x7fa7fe507840] 176x144@[5.000000 5.000000]fps [avfoundation @ 0x7fa7fe507840] 320x240@[30.000030 30.000030]fps [avfoundation @ 0x7fa7fe507840] 320x240@[27.500028 27.500028]fps [avfoundation @ 0x7fa7fe507840] 320x240@[25.000000 25.000000]fps [avfoundation @ 0x7fa7fe507840] 320x240@[22.500023 22.500023]fps [avfoundation @ 0x7fa7fe507840] 320x240@[20.000000 20.000000]fps [avfoundation @ 0x7fa7fe507840] 320x240@[17.500018 17.500018]fps [avfoundation @ 0x7fa7fe507840] 320x240@[14.999993 14.999993]fps [avfoundation @ 0x7fa7fe507840] 320x240@[12.500000 12.500000]fps [avfoundation @ 0x7fa7fe507840] 320x240@[10.000000 10.000000]fps [avfoundation @ 0x7fa7fe507840] 320x240@[7.500002 7.500002]fps [avfoundation @ 0x7fa7fe507840] 320x240@[5.000000 5.000000]fps [avfoundation @ 0x7fa7fe507840] 352x288@[30.000030 30.000030]fps [avfoundation @ 0x7fa7fe507840] 352x288@[27.500028 27.500028]fps [avfoundation @ 0x7fa7fe507840] 352x288@[25.000000 25.000000]fps [avfoundation @ 0x7fa7fe507840] 352x288@[22.500023 22.500023]fps [avfoundation @ 0x7fa7fe507840] 352x288@[20.000000 20.000000]fps [avfoundation @ 0x7fa7fe507840] 352x288@[17.500018 17.500018]fps [avfoundation @ 0x7fa7fe507840] 352x288@[14.999993 14.999993]fps [avfoundation @ 0x7fa7fe507840] 352x288@[12.500000 12.500000]fps [avfoundation @ 0x7fa7fe507840] 352x288@[10.000000 10.000000]fps [avfoundation @ 0x7fa7fe507840] 352x288@[7.500002 7.500002]fps [avfoundation @ 0x7fa7fe507840] 352x288@[5.000000 5.000000]fps [avfoundation @ 0x7fa7fe507840] 640x480@[30.000030 30.000030]fps [avfoundation @ 0x7fa7fe507840] 640x480@[27.500028 27.500028]fps [avfoundation @ 0x7fa7fe507840] 640x480@[25.000000 25.000000]fps [avfoundation @ 0x7fa7fe507840] 640x480@[22.500023 22.500023]fps [avfoundation @ 0x7fa7fe507840] 640x480@[20.000000 20.000000]fps [avfoundation @ 0x7fa7fe507840] 640x480@[17.500018 17.500018]fps [avfoundation @ 0x7fa7fe507840] 640x480@[14.999993 14.999993]fps [avfoundation @ 0x7fa7fe507840] 640x480@[12.500000 12.500000]fps [avfoundation @ 0x7fa7fe507840] 640x480@[10.000000 10.000000]fps [avfoundation @ 0x7fa7fe507840] 640x480@[7.500002 7.500002]fps [avfoundation @ 0x7fa7fe507840] 640x480@[5.000000 5.000000]fps [avfoundation @ 0x7fa7fe507840] 720x480@[25.000000 25.000000]fps [avfoundation @ 0x7fa7fe507840] 720x480@[22.500023 22.500023]fps [avfoundation @ 0x7fa7fe507840] 720x480@[20.000000 20.000000]fps [avfoundation @ 0x7fa7fe507840] 720x480@[17.500018 17.500018]fps [avfoundation @ 0x7fa7fe507840] 720x480@[14.999993 14.999993]fps [avfoundation @ 0x7fa7fe507840] 720x480@[12.500000 12.500000]fps [avfoundation @ 0x7fa7fe507840] 720x480@[10.000000 10.000000]fps [avfoundation @ 0x7fa7fe507840] 720x480@[7.500002 7.500002]fps [avfoundation @ 0x7fa7fe507840] 720x480@[5.000000 5.000000]fps [avfoundation @ 0x7fa7fe507840] 704x576@[25.000000 25.000000]fps [avfoundation @ 0x7fa7fe507840] 704x576@[22.500023 22.500023]fps [avfoundation @ 0x7fa7fe507840] 704x576@[20.000000 20.000000]fps [avfoundation @ 0x7fa7fe507840] 704x576@[17.500018 17.500018]fps [avfoundation @ 0x7fa7fe507840] 704x576@[14.999993 14.999993]fps [avfoundation @ 0x7fa7fe507840] 704x576@[12.500000 12.500000]fps [avfoundation @ 0x7fa7fe507840] 704x576@[10.000000 10.000000]fps [avfoundation @ 0x7fa7fe507840] 704x576@[7.500002 7.500002]fps [avfoundation @ 0x7fa7fe507840] 704x576@[5.000000 5.000000]fps [avfoundation @ 0x7fa7fe507840] 800x600@[30.000030 30.000030]fps [avfoundation @ 0x7fa7fe507840] 800x600@[27.500028 27.500028]fps [avfoundation @ 0x7fa7fe507840] 800x600@[25.000000 25.000000]fps [avfoundation @ 0x7fa7fe507840] 800x600@[22.500023 22.500023]fps [avfoundation @ 0x7fa7fe507840] 800x600@[20.000000 20.000000]fps [avfoundation @ 0x7fa7fe507840] 800x600@[17.500018 17.500018]fps [avfoundation @ 0x7fa7fe507840] 800x600@[14.999993 14.999993]fps [avfoundation @ 0x7fa7fe507840] 800x600@[12.500000 12.500000]fps [avfoundation @ 0x7fa7fe507840] 800x600@[10.000000 10.000000]fps [avfoundation @ 0x7fa7fe507840] 800x600@[7.500002 7.500002]fps [avfoundation @ 0x7fa7fe507840] 800x600@[5.000000 5.000000]fps [avfoundation @ 0x7fa7fe507840] 1024x576@[30.000030 30.000030]fps [avfoundation @ 0x7fa7fe507840] 1024x576@[27.500028 27.500028]fps [avfoundation @ 0x7fa7fe507840] 1024x576@[25.000000 25.000000]fps [avfoundation @ 0x7fa7fe507840] 1024x576@[22.500023 22.500023]fps [avfoundation @ 0x7fa7fe507840] 1024x576@[20.000000 20.000000]fps [avfoundation @ 0x7fa7fe507840] 1024x576@[17.500018 17.500018]fps [avfoundation @ 0x7fa7fe507840] 1024x576@[14.999993 14.999993]fps [avfoundation @ 0x7fa7fe507840] 1024x576@[12.500000 12.500000]fps [avfoundation @ 0x7fa7fe507840] 1024x576@[10.000000 10.000000]fps [avfoundation @ 0x7fa7fe507840] 1024x576@[7.500002 7.500002]fps [avfoundation @ 0x7fa7fe507840] 1024x576@[5.000000 5.000000]fps [avfoundation @ 0x7fa7fe507840] 1024x768@[30.000030 30.000030]fps [avfoundation @ 0x7fa7fe507840] 1024x768@[27.500028 27.500028]fps [avfoundation @ 0x7fa7fe507840] 1024x768@[25.000000 25.000000]fps [avfoundation @ 0x7fa7fe507840] 1024x768@[22.500023 22.500023]fps [avfoundation @ 0x7fa7fe507840] 1024x768@[20.000000 20.000000]fps [avfoundation @ 0x7fa7fe507840] 1024x768@[17.500018 17.500018]fps [avfoundation @ 0x7fa7fe507840] 1024x768@[14.999993 14.999993]fps [avfoundation @ 0x7fa7fe507840] 1024x768@[12.500000 12.500000]fps [avfoundation @ 0x7fa7fe507840] 1024x768@[10.000000 10.000000]fps [avfoundation @ 0x7fa7fe507840] 1024x768@[7.500002 7.500002]fps [avfoundation @ 0x7fa7fe507840] 1024x768@[5.000000 5.000000]fps [avfoundation @ 0x7fa7fe507840] 1280x720@[30.000030 30.000030]fps [avfoundation @ 0x7fa7fe507840] 1280x720@[27.500028 27.500028]fps [avfoundation @ 0x7fa7fe507840] 1280x720@[25.000000 25.000000]fps [avfoundation @ 0x7fa7fe507840] 1280x720@[22.500023 22.500023]fps [avfoundation @ 0x7fa7fe507840] 1280x720@[20.000000 20.000000]fps [avfoundation @ 0x7fa7fe507840] 1280x720@[17.500018 17.500018]fps [avfoundation @ 0x7fa7fe507840] 1280x720@[14.999993 14.999993]fps [avfoundation @ 0x7fa7fe507840] 1280x720@[12.500000 12.500000]fps [avfoundation @ 0x7fa7fe507840] 1280x720@[10.000000 10.000000]fps [avfoundation @ 0x7fa7fe507840] 1280x720@[7.500002 7.500002]fps [avfoundation @ 0x7fa7fe507840] 1280x720@[5.000000 5.000000]fps [avfoundation @ 0x7fa7fe507840] 1280x960@[30.000030 30.000030]fps [avfoundation @ 0x7fa7fe507840] 1280x960@[27.500028 27.500028]fps [avfoundation @ 0x7fa7fe507840] 1280x960@[25.000000 25.000000]fps [avfoundation @ 0x7fa7fe507840] 1280x960@[22.500023 22.500023]fps [avfoundation @ 0x7fa7fe507840] 1280x960@[20.000000 20.000000]fps [avfoundation @ 0x7fa7fe507840] 1280x960@[17.500018 17.500018]fps [avfoundation @ 0x7fa7fe507840] 1280x960@[14.999993 14.999993]fps [avfoundation @ 0x7fa7fe507840] 1280x960@[12.500000 12.500000]fps [avfoundation @ 0x7fa7fe507840] 1280x960@[10.000000 10.000000]fps [avfoundation @ 0x7fa7fe507840] 1280x960@[7.500002 7.500002]fps [avfoundation @ 0x7fa7fe507840] 1280x960@[5.000000 5.000000]fps [avfoundation @ 0x7fa7fe507840] 1280x1024@[30.000030 30.000030]fps [avfoundation @ 0x7fa7fe507840] 1280x1024@[27.500028 27.500028]fps [avfoundation @ 0x7fa7fe507840] 1280x1024@[25.000000 25.000000]fps [avfoundation @ 0x7fa7fe507840] 1280x1024@[22.500023 22.500023]fps [avfoundation @ 0x7fa7fe507840] 1280x1024@[20.000000 20.000000]fps [avfoundation @ 0x7fa7fe507840] 1280x1024@[17.500018 17.500018]fps [avfoundation @ 0x7fa7fe507840] 1280x1024@[14.999993 14.999993]fps [avfoundation @ 0x7fa7fe507840] 1280x1024@[12.500000 12.500000]fps [avfoundation @ 0x7fa7fe507840] 1280x1024@[10.000000 10.000000]fps [avfoundation @ 0x7fa7fe507840] 1280x1024@[7.500002 7.500002]fps [avfoundation @ 0x7fa7fe507840] 1280x1024@[5.000000 5.000000]fps 0: Input/output error |
期せずして入力デバイスのサポートする解像度とフレームレートの一覧を得ることが出来ました。解像度と共に必ず指定する必要があり、これも入力デバイスの指定よりも前に指定する必要が有ります。
-vframes 1
これは静止画取得時に何枚目のフレームを取得するか指定するもので、必ず入力デバイス指定よりも後ろに記述しなければなりません。ffmpegのオプションは、ワークフローのように順序そのものにも意味があることをこの時点で既に痛感しました。
ピクセルフォーマットとプローブサイズの指定
-pix_fmt uyvy422
先ほどの実行結果から、まずは直後の次の部分を読み解くと、
1 2 3 4 5 6 7 8 |
[avfoundation @ 0x7ff97fd07800] Selected pixel format (yuv420p) is not supported by the input device. [avfoundation @ 0x7ff97fd07800] Supported pixel formats: [avfoundation @ 0x7ff97fd07800] uyvy422 [avfoundation @ 0x7ff97fd07800] yuyv422 [avfoundation @ 0x7ff97fd07800] nv12 [avfoundation @ 0x7ff97fd07800] 0rgb [avfoundation @ 0x7ff97fd07800] bgr0 [avfoundation @ 0x7ff97fd07800] Overriding selected pixel format to use uyvy422 instead. |
オプションでピクセルフォーマットを指定しなかったので、デフォルトで「yuv420p」が選択されたものの、入力デバイスのサポート外であることから、「uyvy422」に変更された、と言うもの。結果的に画像は取得出来ていますが、実行の度にこの挙動が出るのは不衛生なので、実行時にピクセルフォーマットを入力デバイスの指定より前方に明記します。
-probesize 10M
次に着目するのはこのメッセージ、プローブサイズを増やしなさいと言うアドバイスですが、
1 |
[avfoundation @ 0x7f8734707440] Stream #0: not enough frames to estimate rate; consider increasing probesize |
調べてみるとffmpegユーザメーリングリストのアーカイヴに答えはありました。このオプションも入力デバイス指定よりも前に記述しなければなりません。
– loglevel error
そして最後にこのメッセージが連続発生する現象、
1 |
[swscaler @ 0x7f9a39016800] [swscaler @ 0x7f9a39708600] deprecated pixel format used, make sure you did set range correctly |
静止画イメージ書き出し側のピクセルフォーマットを明記して解決した例に習い、オプション後方に書き出し用の -pix_fmt を指定したり、そもそも無視してもよい警告なので、 -strict -2 を記述しても警告は消えず。仕方ないのでログレベルで逃げることにします。
オーバーレイを追加
-vf ビデオフィルタオプションを使うと、出力画像中にテキストを描画することが出来るので、これを利用して日付時刻のタイプスタンプを描きます。出力オプションなので、入力デバイスを指定するオプションの後ろに次のように記述します。
1 |
-vf "drawtext=fontsize=28:fontcolor=white:fontfile=/System/Library/Fonts/Helvetica.ttc:box=1:boxcolor=0x000000CC:x=(w-tw)/2:y=h-(2*lh):text='%{localtime}'" |
上記の場合、日付時刻が描かれますが、時刻のみとしたい場合は localtime の出力形式を次のように指定します。
1 |
text='%{localtime\:%X}' |
また、 x=(w-tw)/2:y=h-(2*lh) はテキスト描画位置を指定(中央下段)するもので、指定の無い場合は左上になります。
尚、Ubuntuで試した際にはフォントファイルを指定せずとも良きに計らってくれたのですが、macOSでは明示的に指定しないと動きませんでした。
日付時刻を出力ファイル名に
オプションの最後に指定する出力するファイル名は、 -strftime 1 をセットすると日付時刻を扱えるようになります。
1 |
-strftime 1 "/Users/user/Pictures/iSight/cam_%Y%m%d_%H%M%S.jpg" |
cronに登録して指定時間内連続自動実行
これまで説明してきた通り、ffmpegのオプション記述はかなり長く、そのままワンライナーでcronへは記述出来ないので、簡単なバッチファイルにしておきます。
1 2 3 4 5 6 7 8 9 |
#!/bin/bash basedir="/Users/user/Pictures/iSight/" datestr=`date +%Y%m%d` mkdir -p $basedir$datestr /usr/local/bin/ffmpeg -loglevel error -f avfoundation -pix_fmt uyvy422 -framerate 30 -video_size 1280x1024 -probesize 10M -i "0" -vframes 1 \ -vf "drawtext=fontfile=/System/Library/Fonts/Helvetica.ttc:fontsize=28:fontcolor=white:box=1:boxcolor=0x000000CC:x=(w-tw)/2:y=h-(2*lh):text='%{localtime}'" \ -strftime 1 -pix_fmt yuvj422p "$basedir$datestr/cam_%Y%m%d_%H%M%S.jpg" |
これを試しに平日の夕刻に数時間撮影するよう、一般ユーザのcronジョブとして追加します。
1 2 3 |
# Cron Jobs For User # iSight Security Cam * 17-19 * * 1-5 /Users/user/rec_iSight.sh |
以下の要領でcronの編集後に既存のプロセスを殺すことで、自動的に立ち上がる新規プロセスが新しいジョブ一覧を読み込みます。
1 2 3 4 5 6 7 8 |
cronジョブ一覧編集 $ crontab -e cronジョブ一覧表示 $ crontab -l 編集後の反映 $ sudo pkill -f cron |
数日後、日単位のサブフォルダで仕切られる形で、撮影された画像が格納されました。
このままではストレージを日々のキャプチャ画像が埋め尽くしてしまうので、次回は適当なローテーションや、日毎の静止画をタイムラプス動画にする処理を考えたいと思います。