Add slave code
This commit is contained in:
parent
7ee85cd4f4
commit
6120e3dc14
|
@ -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
|
||||
)
|
|
@ -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=
|
|
@ -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))
|
||||
}
|
|
@ -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()
|
Binary file not shown.
|
@ -0,0 +1,66 @@
|
|||
from random import randint
|
||||
import cv2
|
||||
import numpy as np
|
||||
import os
|
||||
import multiprocessing
|
||||
import time
|
||||
|
||||
class Video:
|
||||
def __init__(self, x, y):
|
||||
self.x = x
|
||||
self.y = y
|
||||
|
||||
def setVideo(self, path):
|
||||
self.path = path
|
||||
|
||||
def start(self):
|
||||
self.run = True
|
||||
self.cap = cv2.VideoCapture(self.path)
|
||||
# Check if camera opened successfully
|
||||
if (self.cap.isOpened()== False):
|
||||
print("Error opening video file")
|
||||
|
||||
totalframecount= int(self.cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||||
|
||||
print("The total number of frames in this video is ", totalframecount)
|
||||
|
||||
# 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):
|
||||
|
||||
# Capture frame-by-frame
|
||||
ret, frame = self.cap.read()
|
||||
if ret == True:
|
||||
|
||||
# Display the resulting frame
|
||||
|
||||
cv2.namedWindow("window", cv2.WND_PROP_FULLSCREEN)
|
||||
cv2.moveWindow("window", self.x, self.y)
|
||||
cv2.setWindowProperty("window",cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_FULLSCREEN)
|
||||
|
||||
cv2.imshow("window", frame)
|
||||
|
||||
# Break the loop
|
||||
else:
|
||||
break
|
||||
|
||||
def stop(self):
|
||||
self.run = False
|
||||
self.cap.release()
|
||||
|
||||
# Closes all the frames
|
||||
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()
|
Loading…
Reference in New Issue