/examples/src/main/scala/examples/WebSocketAsciiVideo.scala

https://github.com/jsuereth/streamerz · Scala · 43 lines · 35 code · 7 blank · 1 comment · 0 complexity · 859a53662c025543f0c35b7c6e874141 MD5 · raw file

  1. package examples
  2. import akka.actor.ActorSystem
  3. import akka.stream.ActorMaterializerSettings
  4. import akka.stream.scaladsl.Sink
  5. import akka.stream.scaladsl.Source
  6. import akka.stream.ActorMaterializer
  7. import com.jsuereth.video.AsciiVideoFrame
  8. import akka.util.Timeout
  9. import akka.http.scaladsl.Http
  10. import akka.http.scaladsl.server.Directives._
  11. import scala.concurrent.duration.DurationInt
  12. import akka.stream.scaladsl.Flow
  13. import akka.stream.scaladsl.Keep
  14. import com.jsuereth.video.AsciiVideoFrame
  15. import akka.http.scaladsl.model.ws.{Message, TextMessage}
  16. import com.jsuereth.image.Ascii
  17. import com.jsuereth.video.AsciiVideo.asciiConversion
  18. object WebSocketAsciiVideo extends App{
  19. implicit val system = ActorSystem()
  20. val settings = ActorMaterializerSettings.create(system)
  21. val video = Source(com.jsuereth.video.WebCam.default(system))
  22. val asciifier = asciiConversion(Ascii.toCharacterColoredHtml, maxWidth = 80, maxHeight = 40)
  23. implicit val executor = system.dispatcher
  24. implicit val timeout = Timeout(1000.millis)
  25. implicit val materializer = ActorMaterializer()
  26. val serverBinding = Http().bindAndHandle(interface = "0.0.0.0", port = 8080, handler = mainFlow)
  27. def mainFlow = path("") {
  28. val socketFlow: Flow[Message, Message, Unit] =
  29. Flow.wrap(Sink.ignore, video.via(asciifier).map(toMessage))(Keep.none)
  30. handleWebsocketMessages(socketFlow)
  31. }
  32. def toMessage(frame: AsciiVideoFrame): Message = {
  33. //println(frame.image)
  34. TextMessage.Strict(frame.image)
  35. }
  36. }