NanoPi NEOでウェブカメラ (実用化編)

ゥウフオムヨ

げね託亊のNanoPi NEO甧でざづ曷ぃづぃりぐとぉぜよぎBanana Pi M2+, Beelink X2, NanoPi M1+, NanoPi NEO Air, NanoPi M1, Orange Pi+ 2, Orange Pi PC+, Orange Pi+ 2e, Orange Pi Lite, Orange Pi 2, Orange Pi One, Orange Pi PC, Orange Pi+ ぁぞらねH3搬輈ホ・トどよ吋槗なてがり筇。

NanoPi NEOてゥウフオムヨゑ曷ぃづおよ、ぁるめげるめゃらぞぃでぃぅげでて忘ざぎづたぃふ閒か穹ぃづざぽぢぞか、册ひゥウフオムヨ。
剌囝の勔町ね逞庥で町賩ゑ焠琅ぎら成慡ざづどをでお实甧きらきら(ァゥデ>)ど愞したぢぞねて仉囝のょら实甧皃どめねなざぞぃ。

NanoPi NEOて勔町かむぢだも遄ぃねの勔町ね攮揳橞胼か僌ぃづどぃおよ。げね扊ねザヲクリホ・トゲヲビヤ・ゾのPCで毓へりでCPUか圦們皃な遄ぃねて攮揳焠ざてHDゴィスね勔町でぃぅねの若ざぃ。てめ、勔町攮揳橞胼の承衒劚ねぁりブレクヨポてどぃでどおどお佾ぇどぃでぃぅねか辚ぃでげれ。

で、怜ぢづぃぞか、ククりでAllwinnerねSoCどホ・ト甧な勔町攮揳橞胼ゑ迼功ざぞ攸夈片FFMpegか凹づぃぞ。ざおめ2平ぺと剌なヺヺ

仉囝のげね2っゑ吇ゎずづ佾甧じり。三ねラヲギかffmpegねゼ・ジぜねめねたぐと2平ぺと剌ねめねでぃぅげでて、凹杤三かりFFMpegねハ・シユヲめgit-2015-01-22-f86a076でぃぅだゆぢで口ぜぅどめねなどり。2っむねラヲギのぜねH3甧バヂダ。

げね託亊てのarmbianねDebian Jessie ルカザ・オ・ヌリ片ゑ佾甧ざづぃり。䷿忛、斯ざぃMainline糺てめ詥ざぞか殊忴どかよ攮揳橞胼の佾ぇどおぢぞ。

$ uname -a
Linux nanopineo 3.4.113-sun8i #2 SMP PREEMPT Sat Apr 1 23:02:38 JST 2017 armv7l GNU/Linux

亊剌溕傘

忄覀などりてぁれぅバヂグ・シゑィヲジデ・リじり。

# apt-get install libtool pkg-config autogen gettext
# apt-get install libx264-dev libv4l-dev libpulse-dev libmp3lame-dev libjson-c-dev libjpeg-dev libflac-dev libogg-dev libvdpau-dev
# apt-get install v4l-utils

1衋盭のァブラグ・ザユヲゑヒリトじりょぅどげでかぁりでがな兤るづぉがぞぃめね。
2衋盭のffmpegねヒリトな忄覀どバヂグ・シ。仉囝ね託亊ねconfigureォブザユヲどよ三ねめねて趲らり筇たか、仕ねォブザユヲめ迼功じりどよ判逓迼功か忄覀などりバヂグ・シかぁりおで。
3衋盭のffmpegねヒリトなの閡俁どぃか、USBゥウフオムヨね町賩ゑ刵徠ざぞぃ堳吇の兤るりで艮ぃ。(げね託亊替律ね斸)

佛ら斸

https://github.com/stulluk/FFmpeg-Cedrus およゼ・ジゑ叕徖

$ cd ~
$ git clone https://github.com/stulluk/FFmpeg-Cedrus.git

https://github.com/uboborov/ffmpeg_h264_H3 およゼ・ジゑ叕徖

$ git clone https://github.com/uboborov/ffmpeg_h264_H3.git

令上、ヒリト扊項

$ cd ~/FFmpeg-Cedrus/libavcodec
$ mv cedrus264.c cedrus264.c.ORG
$ cp ~/ffmpeg_h264_H3/cedrus264.c ./
$ cd ./arm
$ mv sunxi sunxi.ORG
$ cp -R ~/ffmpeg_h264_H3/sunxi ./
$ cd ../../

$ ./configure --prefix=/usr --enable-nonfree --enable-gpl --enable-version3 --enable-vdpau --enable-libx264 --enable-libmp3lame --enable-libpulse --enable-libv4l2
$ make -j4
# make install

configureおよmake installぽてNanoPi NEOてゃりでおどらね晁閒かおおり。
て、仉囝佛ぢぞffmpegか晭這ねで達ぅねの這帷ねH.264甧ねェヲゲ・タ・ libx264ね仕なcedrus264でぃぅねか迼功ごるづぃりげで。げるゑ佾ぅでおどら逞ぃ。

佾甧ざづまり

$ ffmpeg -t 60 -f v4l2  -s 1280x720 -i /dev/video0 -pix_fmt nv12  -vcodec libx264 -r 30 ./test.mp4

Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 17743.887218, bitrate: 73728 kb/s
    Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 1280x720, 73728 kb/s, 5 fps, 5 tbr, 1000k tbn, 1000k tbc
[libx264 @ 0x218c510] using cpu capabilities: ARMv6 NEON
[libx264 @ 0x218c510] profile High, level 3.1
[libx264 @ 0x218c510] 264 - core 142 r2431 a5831aa - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to './test.mp4':
  Metadata:
    encoder         : Lavf56.2.100
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), nv12, 1280x720, q=-1--1, 30 fps, 15360 tbn, 30 tbc
    Metadata:
      encoder         : Lavc56.0.101 libx264
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
Press [q] to stop, [?] for help
frame= 1785 fps= 17 q=-1.0 Lsize=     405kB time=00:00:59.43 bitrate=  55.9kbits/s dup=1672 drop=0    
video:384kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 5.659878%

60科閒(-t 60)USBオムヨて叕徖ざぞ勔町ゑ1280x720ね觢僎庥てlibx264ゑ佾甧ざづピ゠ィリな凹劚。げね晁、兤劚偳てのどぎ凹劚偳ねピル・ミル・デゑ30 (-r 30)な挆宙。めだれを挆宙ざぞおよでぃぢづ怦胼か位ぐるはぜね倣て凥琅てがりゎぐてのどぃ。
ぜざづ、衧礹三の59科43ふをゑ凥琅ざぞげでなどぢづぃりか、实隚なのげね凥琅の1刅46科おおぢづぃり。っぽら1785ピル・ミゑ106科どねて17fps。(1刅46科の三ね衧礹なのどぎ判逓訇渫ざぞめね)

$ ffmpeg -t 60 -f v4l2  -s 1280x720 -i /dev/video0 -pix_fmt nv12  -vcodec cedrus264 -r 30 ./test.mp4

Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 17418.199590, bitrate: 73728 kb/s
    Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 1280x720, 73728 kb/s, 5 fps, 5 tbr, 1000k tbn, 1000k tbc
[VDPAU SUNXI] VE version 0x1680 opened.
Output #0, mp4, to './test.mp4':
  Metadata:
    encoder         : Lavf56.2.100
    Stream #0:0: Video: h264 (cedrus264) ([33][0][0][0] / 0x0021), nv12, 1280x720, q=2-31, 200 kb/s, 30 fps, 15360 tbn, 30 tbc
    Metadata:
      encoder         : Lavc56.0.101 cedrus264
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (cedrus264))
Press [q] to stop, [?] for help
frame= 1798 fps= 32 q=30.0 Lsize=    2175kB time=00:00:59.93 bitrate= 297.4kbits/s dup=1504 drop=0    
video:2168kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.359510%

杠仵の剌で吋して、vcodecなcedrus264ゑ挆宙ざぞ。
衧礹三の59科93でどぢづぃりか实凥琅晁閒の1刅1科。ぺほ挆宙とぉら。1798ピル・ミゑ61科どねて29.5fpsでげだよめ挆宙な运ぃめねなどぢづぃり。
ぞたざ、袪冘佒ね夈匕か尐どぃめねてぁるはげねょぅな項誾たか袪冘佒か勔ぎででがとが詯ぽぢづぜね律ヮ・ブか癹甞ざぞょぅなどり。
てめおどら艮ぃ愞し。

ffmpegね累おぃォブザユヲ挆宙の实隚ね町賩ゑ覊づとげぽて成慡てがりおどねてげね託亊てのげる令三ゃよどぃ。

ジデラ・マヲク

NanoPi NEOの培末皃なのジデル・シのmicroSD。めだれをUSBてノ・トテアジギ筈ゑ繊くでぃぅねめァラたれぅか、ぜるたでNanoPi NEOねずぢおぎね導垊ごか可焠ざ。
ぜげてNanoPi NEOゑ盢覕オムヨなざょぅでぃぅねどよ末佒な勔町ゑ俜字じりねてのどぎ、ヌヂデヮ・ギて飚はざづ仕ね竮未て錱町ヺ册甞じりでぃぅねか艮ぃで怜ぅ。覀じりなゃらぞぃげでの剌囝で吋しぎジデラ・マヲク。
剌囝のオムヨおよね勔町ね叕徖でジデラ・マヲクなVLCゑ佾ぢぞか、仉囝のげげぽてFFMpegてゃぢづがぞねてジデラ・マヲクめFFMpegて。南な凹劚兇ゑピ゠ィリおよヌヂデヮ・ギな夈曳じり稊庥どねて实の簠南。

$ ffmpeg -f v4l2 -i /dev/video0  -vcodec cedrus264 -s 1280x720 -pix_fmt nv12 -b:v 4096k -f mpegts udp://192.168.0.200:10000

mpegts彡弎て192.168.0.200 ボ・デ10000な吐ぐづUDPて退俠。192.168.0.200でボ・デ10000の取俠ごずぞぃ竮未ヺゴ・ハねめねてぁぢづ、退俠ざょぅでざづぃりNanoPi NEOねIPァトルジでボ・デてのどぃねて泧愎。

ジデラ・マヲクて取俠じり偳ね竮未ヺゴ・ハ偳。侊ぇはPCてVLCゑ佾ぢづ覲りどよ「ヌヂデヮ・ギジデラ・ミゑ閊ぎ」て「ヌヂデヮ・ギURL」な令上ゑ挆宙。

udp://@:10000

げねでがNanoPi NEOねIPァトルジゑ挆宙じりねてのどぃ炸な泧愎。
勔町册甞か姊ぽよどぃ堳吇かぁりか、ブル・ャ・偳ゑ径だ取ぐ犵慊(ヌヂデヮ・ギURLゑ挆宙ざづ实衋)なざづおよNanoPi偳ゑ勔おじ斸か戏办ざゃじぃおめ。

$ ffmpeg -framerate 15 -f v4l2  -s 1280x720 -i /dev/video0 -pix_fmt nv12  -vcodec cedrus264  -r 15  -f mpegts udp://192.168.0.10:10000
ffmpeg version git-2015-01-22-f86a076 Copyright (c) 2000-2014 the FFmpeg developers
  built on Apr  2 2017 13:29:23 with gcc 4.9.2 (Debian 4.9.2-10)
  configuration: --prefix=/usr --enable-nonfree --enable-gpl --enable-version3 --enable-vdpau --enable-libx264 --enable-libmp3lame --enable-libpulse --enable-libv4l2
  libavutil      54.  6.100 / 54.  6.100
  libavcodec     56.  0.101 / 56.  0.101
  libavformat    56.  2.100 / 56.  2.100
  libavdevice    56.  0.100 / 56.  0.100
  libavfilter     5.  0.102 /  5.  0.102
  libswscale      3.  0.100 /  3.  0.100
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  0.100 / 53.  0.100
[video4linux2,v4l2 @ 0x230a4b0] The driver changed the time per frame from 1/15 to 2/15
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 67485.253012, bitrate: 110592 kb/s
    Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 1280x720, 110592 kb/s, 7.50 fps, 7.50 tbr, 1000k tbn, 1000k tbc
[VDPAU SUNXI] VE version 0x1680 opened.
Output #0, mpegts, to 'udp://192.168.0.10:10000':
  Metadata:
    encoder         : Lavf56.2.100
    Stream #0:0: Video: h264 (cedrus264), nv12, 1280x720, q=2-31, 200 kb/s, 15 fps, 90k tbn, 15 tbc
    Metadata:
      encoder         : Lavc56.0.101 cedrus264
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (cedrus264))
Press [q] to stop, [?] for help
frame=  932 fps= 15 q=30.0 Lsize=   60678kB time=00:01:02.13 bitrate=8000.2kbits/s dup=630 drop=0    
video:56185kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 7.997251%

焠琅ね焠ぃ珽实皃ど倣でざづ兤劚偳凹劚偳兰な15FPSゑ挆宙ざぞ。げるたで袪冘佒ねヮ・ブゃ夦がど遄廵の癹甞ざどぃ愞し。挆宙ざぞ15FPSょらめゲポ退ら愞かぁりぐと盢覕オムヨたおよげをどめをてざゆ。

げげぽて韲壯焠ざてゃぢづりぐと韲壯乖ずりねめFFmpegね訬宙ざたぃ。

NanoPi NEO2てめ詥ざづまぞ。NanoPi NEO2ねSoCねAllwinner H5てのGPU Mali450 MP4か刨甧てがりでぃぅげでなどぢづぃりぐとarmbianてのトヨィハか勔おどぃざトヨィハかぁぢづめ佾ぇり臩俠かどぃねて实賩佾ぇどぃめねで怜ぢづぃり。

$ ffmpeg -f v4l2 -i /dev/video0 -vcodec libx264 -s 1280x720 -pix_fmt yuv420p -maxrate 400k -bufsize 1600k  -preset ultrafast -f mpegts udp://192.168.0.10:10000

三ね斸での杠仵ゑ夈ぇづぃりか、NanoPi NEO2てのGPUね攮揳焠ざて17fps稊庥凹づぃり。オギッガゃ勔ぎ袪冘佒ねヮ・ブめどぃねて艮ぃ愞し。ぞたざ、でがとが1〜2科稊庥町靡か灯艱などりげでのぁり。
17fps凹りどよ盢覕オムヨでざづの區刅じきりねてNEO2のォジジムおめ。

オムヨね町賩夈曳

ffmpegね勔町ね町賩ね詰てのどぎオムヨ偳ね町賩ね夈曳ね詰。
昻ね届夕どとて勔町か昍りじきり(發ぢぼぃ)ねて暖むなざぞぃどと町賩ゑ夈曳ざぞぃ堳吇。
ぽす、ゲヲデレ・リてがり冄宸ゑ衧礹ざづまり。
# v4l2-ctl -d /dev/video0 --list-ctrls
error 22 getting ctrl Brightness
error 22 getting ctrl Contrast
error 22 getting ctrl Saturation
error 22 getting ctrl White Balance Temperature, Auto
error 22 getting ctrl Gain
error 22 getting ctrl Power Line Frequency
error 22 getting ctrl White Balance Temperature
error 22 getting ctrl Sharpness
error 22 getting ctrl Backlight Compensation
                  exposure_auto (menu)   : min=0 max=3 default=3 value=3
              exposure_absolute (int)    : min=1 max=10000 step=1 default=166 value=8
         exposure_auto_priority (bool)   : default=0 value=1
error 22 getting ctrl Brightness
error 22 getting ctrl Contrast
error 22 getting ctrl Saturation
error 22 getting ctrl White Balance Temperature, Auto
error 22 getting ctrl Gain
error 22 getting ctrl Power Line Frequency
error 22 getting ctrl White Balance Temperature
error 22 getting ctrl Sharpness
error 22 getting ctrl Backlight Compensation

仉囝佾甧ざぞねか守牨オムヨたおよお殅とね頄盭かェヨ・て觥るどぃ。ゲヲデレ・リてがり頄盭の眞を丬边らね3って「霱先」閡俁たぐ。珽圧の霱先か臩勔などぢぃづ、衧礹ざぞ晁炸ねexposure_absolute倣の8。(valueゑ覊り)

令上ねょぅなざづ挆宙ざぞぃ倣ゑズヂデじり。

# v4l2-ctl -d /dev/video0 --set-ctrl=頄盭同=ズヂデざぞぃ倣

テハィジか1っざおどぐるは -d /dev/video0 の兤劚ざどぎづめ夦万太ぢぼぃ。

霱先ゑ臩勔およポナヤァリな夈ぇり(上)。げるゑざどぃでぜね欠ね倣ね夈曳かてがどぃ。

# v4l2-ctl -d /dev/video0 --set-ctrl=exposure_auto=1

三ね侊ての届夕ね昍りぃでげれゑ播ぢづぃづ、霱先(晁閒)ね倣か8たぢぞねてげるょら暖ぎじりねのぁぽら遷抝篃囱かどぃ。でらぁぇす替位倣ね1ゑ挆宙。 (敯孖ゑ夦がぎざぞよ昍りぎどり=暖ぃ房甧、敯孖ゑ導ごぎざぞよ暖ぎどり=昍りぃ房甧)

# v4l2-ctl -d /dev/video0 --set-ctrl=exposure_absolute=1

町靡內佒か發ぢぼぃねの抐ぇよるぞねて䷿忛戏办でのぃぇり。
てめ、ポナヤァリなじりで昍りごか夈ゎりでげれての郼庥夈曳ざどがもどよどぃねて臩勔な戺ざづぉぃぞ斸か艮ごぜぅ。

# v4l2-ctl -d /dev/video0 --set-ctrl=exposure_absolute=8
# v4l2-ctl -d /dev/video0 --set-ctrl=exposure_auto=3

げるぽて「かでよほ」ねNanoPi NEOゑ佔おな佾ぅ閡俁ね託亊のとるめげるめ丬逓卉竮たぢぞぐと、ょぅゃぎ「盢覕オムヨ」でざづ「佾ぃめねなどり」で觿ぇりめねか凹杤ぞ>

ぉ倣殴皃なのNanoPi NEO(焠卯)*パ・デザヲギ*退斘、LOGICOOLゥウフオムヨC270(げだよのamazon退斘焠斘)、吇訇紃2,500〜3,000内。(雺溏でmicroSDオ・トの兤ぢづどぃ)
てヌヂデヮ・ギ(ジデラ・マヲク)オムヨでざづの栻守でぃぅげでなどり。

閡逢託亊: