การสร้าง 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.
เป็นอันจบฝั่งส่ง
ฝั่งรับ
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
สิ่งที่ต้องเตรียม
ฝั่งส่ง
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"
ปัญหาที่พบ
ถ้าฝั่ง 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 ทำได้ตามโค้ดด้านล่าง
#/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)
ความคิดเห็น
แสดงความคิดเห็น