การสร้าง Raspberry Pi 3b ให้กลายเป็น กล้องวงจรปิด Video Streaming Server ด้วย RTSP โปรโตคอล

 แม้ว่าตัวอย่างของเราจะใช้ลินุกซ์ desktop ในการรับ  แต่สำหรับวินโดวส์ก็น่าจะใช้ VLC บน วินโดวส์ได้ ชื่อเต็มของ VLC คือ VideoLan  VLC

สิ่งที่ต้องเตรียม

ฝั่งส่ง
1. กล้องของ Raspberry Pi 3b
2. Raspberry pi

ฝั่งรับ
1. computer มีโปรแกรม VLC


เริ่มจากฝั่งส่ง
0. ติดตั้ง Raspbian OS จะไม่อธิบาย
1. ติดตั้งกล้องดังภาพ
2. เปิด terminal ของ Raspbian พิมพ์
sudo apt-get update && sudo apt-get upgrade

3. sudo raspi-config
เลือกไปที่ interface->enable camera

4. reboot 1 ที

5. ทดลอง กล้อง   โดยใช้คำสั่ง ด้านล่าง  ที่ terminal
raspistill -o  image.jpg
น่าจะเห็น GUI window ขึ้นมา หนึ่งหน้าต่างข้างในมีภาพจากกล้อง

6. เตรียม ip address  ตรวจว่าตนเอง ip อะไร
ifconfig   หา Ip address ของตัวเอง

7. ลง VLC ใน raspbian
sudo apt-get install vlc

8. เริ่มการถ่ายทอดสด video streaming หมายเหตุ  แก้ 192.168.1.34 ในคำสั่งข้างล่างเป็น ip ของตัวเองที่เจอในข้อ6.
raspivid -o - -t 0 -n | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://192.168.1.34:8554/}' :demux=h264
 
 
Reference 
http://www.raspberry-projects.com/pi/pi-hardware/raspberry-pi-camera/streaming-video-using-vlc-player 

เป็นอันจบฝั่งส่ง


ฝั่งรับ

1.  เปิด VLC ขึ้นมา กด ctrl-n จะมีภาพนี้ขึ้นมา
ให้ใส่ค่าตามภาพ  เปลี่ยน ip เป็นไอพีที่เจอในข้อ6.
2. กด play จบ.




 ภาพแสดงผลการแสดงวิดีโอจากcameraของ raspbian เปิดที่เครื่องdesktop

3.เพิ่มเติม สำหรับคนที่ต้องการ save ภาพลง hard disk ของ ลินุกซ์
โปรด ดูบรรทัด
if !(( 0 <= $((H)) && $((H)) < 7 )); then
    if !(( 22 <= $((H)) && $((H)) < 24 )); then
ตรงนี้ผมพยายามจะบอกว่า กลางคืน ไม่ต้อง save (เปลือง)   เพื่อเตือนความจำว่าเขียนสอง if นี้ไปทำไม เลยทำการ
echo "NOT between 22PM and 7AM"

#/bin/bash
#TIMEOUT IN SECOUND per file
TIMEOUT="300"
FILEPATH='/working2/peerajak/raspberry_pi_stream/data/'
FILE_REALPREFIX=rasp
FILE_PREFIX=$FILEPATH$FILE_REALPREFIX
FILE_SUFFIX=\.asf
i="1"
CMD_PRE="cvlc rtsp://192.168.1.54:8554/ --sout=\"#duplicate{dst=std{access=file,mux=asf,dst='"
CMD_SUF="'},dst=nodisplay}\" --run-time "
CMD_SUF2=$TIMEOUT" vlc://quit"

trap "exit" SIGINT SIGTERM
while [ true ]
do
FILENUM=$(date +%Y%m%d%H%M%S)
FILENAME=$FILE_PREFIX$FILENUM$FILE_SUFFIX
CMD=$CMD_PRE$FILENAME$CMD_SUF$CMD_SUF2
Ha=$(date +%H)
H=$(expr $Ha + 0)
if !(( 0 <= $((H)) && $((H)) < 7 )); then
    if !(( 22 <= $((H)) && $((H)) < 24 )); then
        echo "NOT between 22PM and 7AM"
        echo $CMD
        eval $CMD
    fi
fi
sleep 5
i=$[$i+1]
done



ปัญหาที่พบ
ถ้าฝั่ง server ใช้ opencv  ที่ลง FFMPEG ไว้ด้วย  จะทำให้ภาพที่ได้รับมีnoiseเฉพาะไม่กี่เฟรมแรกๆของวิดีโอ  ดังภาพ
วิธีแก้คือลง opencv ใหม่ โดย disable FFMPEG ของ opencv ดังนี้
cmake -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_OPENGL=ON -D WITH_VTK=ON -D CUDA_GENERATION=Auto -D WITH_FFMPEG=OFF -D WITH_TIFF=OFF ..

ตัวแดง แสดงถึงตัวที่เพิ่มขึ้นมาเพื่อแกัปัญหา 
เมื่อ install opencv ใหม่ ตามวิธีนี้ http://peerajakwitoonchart.blogspot.com/2015/02/install-opencv-2410-on-linux-ubuntu.html  ก็จะหาย  ดังภาพ

ซึ่งตรงนี้สำคัญ เพราะเมื่อต้องการ CAPTURE จาก OpenCV ถ้าไม่แก้  จะเป็นภาพที่ผิดตลอด

การดึงภาพจาก opencv ทำได้ตามโค้ดด้านล่าง
vcap = cv2.VideoCapture("rtsp://192.168.1.115:8554/")
while(1):
    ret, frame = vcap.read()
    cv2.imshow('VIDEO', frame)
    cv2.waitKey(10)


ความคิดเห็น

บทความที่ได้รับความนิยม