Compare commits

...

3 Commits

Author SHA1 Message Date
jimmy 7ccb745daf delete main.py, video.py 2022-07-18 17:35:11 +12:00
jimmy 1505801985 Add dependencies 2022-07-18 17:34:37 +12:00
jimmy 6120e3dc14 Add slave code 2022-07-18 17:30:07 +12:00
9 changed files with 281 additions and 77 deletions

View File

@ -4,12 +4,11 @@ verify_ssl = true
name = "pypi"
[packages]
python-vlc = "*"
opencv-python = "*"
screeninfo = "*"
serial = "*"
paho-mqtt = "*"
startspimage = "*"
pygame = "*"
[dev-packages]

130
Pipfile.lock generated
View File

@ -1,7 +1,7 @@
{
"_meta": {
"hash": {
"sha256": "ed6f5adc48a375df01b39e00b0c026dd3add47599e4fc4e05bb75513cace77d1"
"sha256": "3ead243ae65c4b2814edf7b7a1973caef775cf0d69385003ca32e07485694a39"
},
"pipfile-spec": 6,
"requires": {
@ -16,21 +16,6 @@
]
},
"default": {
"future": {
"hashes": [
"sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"
],
"markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==0.18.2"
},
"iso8601": {
"hashes": [
"sha256:27f503220e6845d9db954fb212b95b0362d8b7e6c1b2326a87061c3de93594b1",
"sha256:d7bc01b1c2a43b259570bb307f057abc578786ea734ba2b87b836c5efc5bd443"
],
"markers": "python_full_version >= '3.6.2' and python_full_version < '4.0.0'",
"version": "==1.0.2"
},
"numpy": {
"hashes": [
"sha256:1408c3527a74a0209c781ac82bde2182b0f0bf54dea6e6a363fe0cc4488a7ce7",
@ -56,7 +41,7 @@
"sha256:d748ef349bfef2e1194b59da37ed5a29c19ea8d7e6342019921ba2ba4fd8b624",
"sha256:e0d7447679ae9a7124385ccf0ea990bb85bb869cef217e2ea6c844b6a6855073"
],
"markers": "python_version >= '3.7'",
"markers": "python_version >= '3.10'",
"version": "==1.23.1"
},
"opencv-python": {
@ -143,52 +128,69 @@
"markers": "python_version >= '3.7'",
"version": "==9.2.0"
},
"python-vlc": {
"pygame": {
"hashes": [
"sha256:92f98fee088f72bd6d063b3b3312d0bd29b37e7ad65ddeb3a7303320300c2807",
"sha256:c409afb38fe9f788a663b4302ca583f31289ef0860ab2b1668da96bbe8f14bfc"
"sha256:0427c103f741234336e5606d2fad86f5403c1a3d1dc55c309fbff3c984f0c9ae",
"sha256:07ca9f683075aea9bd977af9f09a720ebf747343d3ea8103e4f1735283b02330",
"sha256:0e06ae8e1c830f1b9c36a2bc6bb11de840232e95b78e2c349c6ed803a303be19",
"sha256:0e97d38308c441942577fea7fcd1326308bc56d6be6c024218e94d075d322e0f",
"sha256:119dee20c372c85dc47b717119534d15a60c64ceab8b0eb09278866d10486afe",
"sha256:1219a963941bd53aa754e8449364c142004fe706c33a9c22ff2a76521a82d078",
"sha256:1fddec8829e96424800c806582d73a5173b7d48946cccf7d035839ca09850db8",
"sha256:20676da24e3e3e6b9fc4eecc7ba09d77ef46c3a83a028763ba1d222476c2e3fb",
"sha256:2405414d8c572668e04739875661e030a0c588e197fa95463fe301c3d0a0510b",
"sha256:24254c4244f0d9bdc904f5d3f38e86757ca4c6aa0e44a6d55ef5e016bc7274d6",
"sha256:24b4f7f30fa2b3d092b60be6fcc725fb91d569fc87a9bcc91614ee8b0c005726",
"sha256:3bb0674aa789848ddc264bfc60c54965bf3bb659c141de4f600e379acc9b944c",
"sha256:3c8d6637ff75351e581327efefa9d04eeb0f257b533392b6cc6b15ceca4f7c5e",
"sha256:40e4d8d65985bb467d9c5a1305fb53fd6820c61d764979600becab973339676f",
"sha256:4aa3ae32320cc704d63e185864e44f6265c2a6e52c9384afe152cc3d51b3a2ef",
"sha256:50d9a21edd551669862c27c9272747401b20b1939abaacb842c08ea1cdd1c04d",
"sha256:5c7600bf307de1ca1dca0cc7840e34604d5b0b0a5a5dad345c3fa62b054b886d",
"sha256:5d0c14152d0ca8ef5fbcc5ed9981462bdf59a9ae85a291e62d8a8d0b7e5cbe43",
"sha256:5e88b0d4338b94960686f59396f23f7f684fed4859fcc3b9f40286d72c1c61af",
"sha256:5ebbefb8b576572c8fc97a3321d37dc2b4afea6b6e3877a67f7158d8c2c4cefe",
"sha256:636f51f56615d67459b11918206bb4da30cd7d7042027bf997c218ccd6c77902",
"sha256:660c80c0b2e80f1f801715583b759fb4c7bc0c11eb3b534e89c9fc4bfbc38acd",
"sha256:6ecda8dd4583982bb65f9c682f244a5e94524dcf628379766227e9ed97201a49",
"sha256:754c2906f2ef47173a14493e1de116b2a56a2c8e1764f1202ba844d080248a5b",
"sha256:7889dce887ec83c9a0bef8d9eb3669d8863fdaf37c45bacec707d8ad90b24a38",
"sha256:7fdb93b4282962c9a2ebf1af994ee698be823dd913218ed97a5f2fb372b10b66",
"sha256:8e87716114e97322fb177e223d889a4be369a0f73212f4f8507fe0cd43253b23",
"sha256:93c4cbfc942dd00410eaa9e84252129f9f9993f37f683006d7b49ab245342254",
"sha256:9649419254d3282dae41f23837de4108b17bc62187c3acd8af2ae3801b765cbd",
"sha256:97a74ba186deee68318a52637012ef6abf5be6282c659e1d1ba6ad08cf35ec85",
"sha256:9d6452419e01a0f848aed0597f69fd10a4c2a7750c15d1b0607f86090a39dcf3",
"sha256:9d7b021b8dde5d528363e474bc18bd6f79a9666eef89fb4859bcb8f0a536c9de",
"sha256:a0ccf8e3dce7ca67d523a6020b7e3dbf4b26797a9a8db5cc4c7b5ef20fb64701",
"sha256:a56a811d8821f7b9a594e3d0e0dd8bd39b25e3eea8963d5963263b90fd2ea5c2",
"sha256:c5ea87da5fe4b6164c3854f3b0c9146811dbad0dd7fa74297683dfacc485ae1c",
"sha256:c99b95e62cdda29c2e60235d7763447c168a6a877403e6f9ca5b2e2bb297c2ce",
"sha256:c9ce7f3d8af14d7e04eb7eb41c5e5313c43508c252bb2b9eb53e51fc87ada9fd",
"sha256:ca5ef1315fa67c241a657ab077be44f230c05740c95f0b46409457dceefdc7e5",
"sha256:d2d3c50ee9847b743db6cd7b1bb17a94c2c2abc16679d70f5e745cabdf19e655",
"sha256:d6d0eca28f886f0477cd0721ac688189155a587f2bb8eae740e52ca56c3ad23c",
"sha256:dad6bf3fdd3752d7519422f3732be779b98fe7c87d32c3efe2fdffdcbeebb6ca",
"sha256:db2f40d5a75fd9cdda473c58b0d8b294da6e0179f00bb3b1fc2f7f29cac09bea",
"sha256:dc4444d61d48c5546df5137cdf81554887ddb6e2ef1be7f51eb77ea3b6bdd56f",
"sha256:dcc285ee1f1d0e2672cc52f880fd3f564b1505de710e817f692fbf64a72ca657",
"sha256:dd528dbb91eca16f7522c975d0f9e94b95f6b5024c82c3247dc0383d242d33c6",
"sha256:e09044e9e1aa8512d6a9c7ce5f94b881824bcfc401105f3c24f546dfc3bb4aa5",
"sha256:e18c9466131378421d00fc40b637425229238d506a073d9c537b230b355a25d6",
"sha256:e1bb25986db77a48f632469c6bc61baf7508ce945aa6161c02180d4ee5ac5b8d",
"sha256:e4b4cd440d50a9f8551b8989e856aab175593af07eb825cad22fd2f8f6f2ffce",
"sha256:e627300a66a90651fb39e41601d447b1fdbbfffca3f08ef0278d6cc0436b2160",
"sha256:e7a8e18677e0064b7a422f6653a622652d932826a27e50f279d55a8b122a1a83",
"sha256:e8632f6b2ddb90f6f3950744bd65d5ef15af615e3034057fa30ff836f48a7179",
"sha256:ea36f4f93524554a35cac2359df63b50af6556ed866830aa1f07f0d8580280ea",
"sha256:f149e182d0eeef15d8a9b4c9dad1b87dc6eba3a99bd3c44a777a3a2b053a3dca",
"sha256:fc2e5db54491e8f27785fc5204c96f540d3557dcf5b0a9a857b6594d6b32561b",
"sha256:fc30e834f65b893d1b4c230070183bf98e6b70c41c1511687e8436a33d5ce49d",
"sha256:fcc9586e17875c0cdf8764597955f9daa979098fd4f80be07ed68276ac225480",
"sha256:ff961c3280d6ee5f4163f4772f963d7a4dbe42e36c6dd54b79ad436c1f046e5d"
],
"index": "pypi",
"version": "==3.0.16120"
},
"pyyaml": {
"hashes": [
"sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293",
"sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b",
"sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57",
"sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b",
"sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4",
"sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07",
"sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba",
"sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9",
"sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287",
"sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513",
"sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0",
"sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0",
"sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92",
"sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f",
"sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2",
"sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc",
"sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c",
"sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86",
"sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4",
"sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c",
"sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34",
"sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b",
"sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c",
"sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb",
"sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737",
"sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3",
"sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d",
"sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53",
"sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78",
"sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803",
"sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a",
"sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174",
"sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"
],
"markers": "python_version >= '3.6'",
"version": "==6.0"
"version": "==2.1.2"
},
"screeninfo": {
"hashes": [
@ -198,14 +200,6 @@
"index": "pypi",
"version": "==0.8"
},
"serial": {
"hashes": [
"sha256:542150a127ddbf5ed2acc3a6ac4ce807cbcdae3b197acf785bbda6565c94f848",
"sha256:e887f06e07e190e39174b694eee6724e3c48bd361be1d97964caef5d5b61c73b"
],
"index": "pypi",
"version": "==0.0.97"
},
"startspimage": {
"hashes": [
"sha256:4f726cc244baad240dcdac4ec387211d46a2d67abe6ce60e366d87b2915acd89"

View File

8
slave/go.mod Normal file
View File

@ -0,0 +1,8 @@
module slave
go 1.18
require (
github.com/adrg/libvlc-go/v3 v3.1.5
github.com/gotk3/gotk3 v0.6.1
)

4
slave/go.sum Normal file
View File

@ -0,0 +1,4 @@
github.com/adrg/libvlc-go/v3 v3.1.5 h1:TGO0dvubmLCSE4ocOtJYMBlPYALm8aGMkCuDZ6cXnM0=
github.com/adrg/libvlc-go/v3 v3.1.5/go.mod h1:xJK0YD8cyMDejnrTFQinStE6RYCV1nlfS8KmqTpszSc=
github.com/gotk3/gotk3 v0.6.1 h1:GJ400a0ecEEWrzjBvzBzH+pB/esEMIGdB9zPSmBdoeo=
github.com/gotk3/gotk3 v0.6.1/go.mod h1:/hqFpkNa9T3JgNAE2fLvCdov7c5bw//FHNZrZ3Uv9/Q=

147
slave/main.go Normal file
View File

@ -0,0 +1,147 @@
package main
import (
"log"
"os"
vlc "github.com/adrg/libvlc-go/v3"
"github.com/gotk3/gotk3/cairo"
"github.com/gotk3/gotk3/glib"
"github.com/gotk3/gotk3/gtk"
)
const appID = "com.github.libvlc-go.gtk3-media-player-example"
func builderGetObject(builder *gtk.Builder, name string) glib.IObject {
obj, _ := builder.GetObject(name)
return obj
}
func assertErr(err error) {
if err != nil {
log.Panic(err)
}
}
func assertConv(ok bool) {
if !ok {
log.Panic("invalid widget conversion")
}
}
func playerReleaseMedia(player *vlc.Player) {
player.Stop()
if media, _ := player.Media(); media != nil {
media.Release()
}
}
func main() {
// Initialize libVLC module.
err := vlc.Init("--quiet", "--no-xlib")
assertErr(err)
// Create a new player.
player, err := vlc.NewPlayer()
assertErr(err)
// Create new GTK application.
app, err := gtk.ApplicationNew(appID, glib.APPLICATION_FLAGS_NONE)
assertErr(err)
app.Connect("activate", func() {
// Load application layout.
builder, err := gtk.BuilderNewFromFile("layout.glade")
assertErr(err)
// Get application window.
appWin, ok := builderGetObject(builder, "appWindow").(*gtk.ApplicationWindow)
assertConv(ok)
// Get play button.
playButton, ok := builderGetObject(builder, "playButton").(*gtk.Button)
assertConv(ok)
// Add builder signal handlers.
signals := map[string]interface{}{
"onRealizePlayerArea": func(playerArea *gtk.DrawingArea) {
// Set window for the player.
playerWindow, err := playerArea.GetWindow()
assertErr(err)
err = setPlayerWindow(player, playerWindow)
assertErr(err)
},
"onDrawPlayerArea": func(playerArea *gtk.DrawingArea, cr *cairo.Context) {
cr.SetSourceRGB(0, 0, 0)
cr.Paint()
},
"onActivateOpenFile": func() {
fileDialog, err := gtk.FileChooserDialogNewWith2Buttons(
"Choose file...",
appWin, gtk.FILE_CHOOSER_ACTION_OPEN,
"Cancel", gtk.RESPONSE_DELETE_EVENT,
"Open", gtk.RESPONSE_ACCEPT)
assertErr(err)
defer fileDialog.Destroy()
fileFilter, err := gtk.FileFilterNew()
assertErr(err)
fileFilter.SetName("Media files")
fileFilter.AddPattern("*.mp4")
fileFilter.AddPattern("*.mp3")
fileDialog.AddFilter(fileFilter)
if result := fileDialog.Run(); result == gtk.RESPONSE_ACCEPT {
// Release current media, if any.
playerReleaseMedia(player)
// Get selected filename.
filename := fileDialog.GetFilename()
// Load media and start playback.
if _, err := player.LoadMediaFromPath(filename); err != nil {
log.Printf("Cannot load selected media: %s\n", err)
return
}
player.Play()
playButton.SetLabel("gtk-media-pause")
}
},
"onActivateQuit": func() {
app.Quit()
},
"onClickPlayButton": func(playButton *gtk.Button) {
if media, _ := player.Media(); media == nil {
return
}
if player.IsPlaying() {
player.SetPause(true)
playButton.SetLabel("gtk-media-play")
} else {
player.Play()
playButton.SetLabel("gtk-media-pause")
}
},
"onClickStopButton": func(stopButton *gtk.Button) {
player.Stop()
playButton.SetLabel("gtk-media-play")
},
}
builder.ConnectSignals(signals)
appWin.ShowAll()
app.AddWindow(appWin)
})
// Cleanup on exit.
app.Connect("shutdown", func() {
playerReleaseMedia(player)
player.Release()
vlc.Release()
})
// Launch the application.
os.Exit(app.Run(os.Args))
}

42
slave/main.py Normal file
View File

@ -0,0 +1,42 @@
# importing vlc module
from email import message
from pydoc import cli
from statistics import median
import vlc
from time import sleep
import paho.mqtt.client as mqtt
from video import Video
import multiprocessing
class App:
def __init__(self, client):
self.client = client
self.video = Video(4000, 1000)
def on_connect(self, client, userdata, flags, rc):
print("Connected with result code "+str(rc))
self.client.subscribe("video")
def on_message(self, client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
if msg.payload == b'start':
print("Start")
self.video.setVideo("slave/sample-mp4-file.mp4")
self.x = multiprocessing.Process(target = self.video.start)
self.x.start()
elif msg.payload == b'stop':
print("Stop")
self.x.terminate()
client = mqtt.Client()
app = App(client)
client.on_connect = app.on_connect
client.on_message = app.on_message
client.connect("10.173.54.35", 1883, 60)
client.loop_forever()

BIN
slave/sample-mp4-file.mp4 Normal file

Binary file not shown.

View File

@ -2,6 +2,8 @@ from random import randint
import cv2
import numpy as np
import os
import multiprocessing
import time
class Video:
def __init__(self, x, y):
@ -22,7 +24,7 @@ class Video:
print("The total number of frames in this video is ", totalframecount)
self.cap.set(cv2.CAP_PROP_POS_FRAMES, randint(0, totalframecount* 0.9))
# self.cap.set(cv2.CAP_PROP_POS_FRAMES, randint(0, totalframecount* 0.9))
# Read until video is completed
while(self.cap.isOpened() and self.run):
@ -38,11 +40,6 @@ class Video:
cv2.setWindowProperty("window",cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_FULLSCREEN)
cv2.imshow("window", frame)
# Press Q on keyboard to exit
if cv2.waitKey(25) & 0xFF == ord('q'):
break
# Break the loop
else:
@ -53,4 +50,17 @@ class Video:
self.cap.release()
# Closes all the frames
cv2.destroyAllWindows()
cv2.destroyAllWindows()
if __name__ == "__main__":
video = Video(0, 0)
video.setVideo("slave/sample-mp4-file.mp4")
x = multiprocessing.Process(target = video.start)
x.start()
time.sleep(1)
x.terminate()
time.sleep(1)
x = multiprocessing.Process(target = video.start)
x.start()
time.sleep(1)
x.terminate()