Difference between revisions of "Ogg"
From GiderosMobile
m (Text replacement - "</source>" to "</syntaxhighlight>") |
|||
Line 7: | Line 7: | ||
Adds support for Ogg audio and Theora video. | Adds support for Ogg audio and Theora video. | ||
− | === | + | === Examples === |
+ | '''A Video Sprite''' | ||
<syntaxhighlight lang="lua"> | <syntaxhighlight lang="lua"> | ||
Theora=require "Theora" | Theora=require "Theora" | ||
Line 15: | Line 16: | ||
videoSprite:setPosition(0, 64) | videoSprite:setPosition(0, 64) | ||
stage:addChild(videoSprite) | stage:addChild(videoSprite) | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | '''Recording your mic and camera to an .ogg video file''' | ||
+ | <syntaxhighlight lang="lua"> | ||
+ | -- Microphone plugin, for recording in gideros | ||
+ | require "microphone" | ||
+ | -- Camera plugin, to get images from | ||
+ | require "camera" | ||
+ | -- Theora system (from ogg plugin) | ||
+ | local theora=require "theora.core" | ||
+ | |||
+ | --Locate available cameras | ||
+ | lst=Camera.availableDevices() | ||
+ | for k,cam in ipairs(lst) do | ||
+ | print("#"..k.." Desc:"..cam.description.." Pos:"..cam.position.." Dev:"..cam.name) | ||
+ | end | ||
+ | -- Pick the first available | ||
+ | local cname=lst[1].name | ||
+ | |||
+ | cw,ch=640,480 | ||
+ | --Theora needs full 16x16 blocks | ||
+ | ch=(ch+15)&~15 | ||
+ | cw=(cw+15)&~15 | ||
+ | --Create texture and start camera | ||
+ | Camera.texture=RenderTarget.new(cw,ch) | ||
+ | Camera.start(Camera.texture,cname) | ||
+ | |||
+ | --Set our stage size | ||
+ | application:setLogicalDimensions(cw,ch) | ||
+ | --Show our live video | ||
+ | local b=Bitmap.new(Camera.texture) | ||
+ | stage:addChild(b) | ||
+ | |||
+ | --Prepare for recording | ||
+ | local mic=Microphone.new("",24000,2,16) | ||
+ | mic:setOutputFile("|T|mic.ogg") | ||
+ | |||
+ | --Laucnh recording process | ||
+ | Core.asyncCall(function() | ||
+ | --Wait a frame and disable auto yield | ||
+ | Core.yield(true) | ||
+ | --Start recording and get recording stream id | ||
+ | mic:start() | ||
+ | local id=mic:getStreamId() | ||
+ | --Encode video header immediately, before audio data gets encoded | ||
+ | --Parameters are: | ||
+ | -- . stream id | ||
+ | -- . codec name | ||
+ | -- . frame rate (here 30fps) | ||
+ | -- . image width | ||
+ | -- . image height | ||
+ | -- . image format (use 3 for now, nothing else is supported) | ||
+ | -- . image quality | ||
+ | theora.beginVideo(id,"theora",30,cw,ch,3,0.6) | ||
+ | -- Now encode 120 video frames, every other gideros frame (60fps->30fps) | ||
+ | for i=1,120 do | ||
+ | --Parameters: | ||
+ | -- . stream id | ||
+ | -- . frame id (zero based) | ||
+ | -- . image texture | ||
+ | -- . end of stream indicator | ||
+ | theora.encodeVideoFrame(id,(i-1),Camera.texture,(i==120)) | ||
+ | Core.yield(true) | ||
+ | Core.yield(true) | ||
+ | end | ||
+ | -- Stop recording | ||
+ | mic:stop() | ||
+ | -- For testing, read encoded file and print its size | ||
+ | local f=io.open("|T|mic.ogg","rb") | ||
+ | local ct=f:read("*all") | ||
+ | f:close() | ||
+ | print("Ended",#ct) | ||
+ | end) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Revision as of 15:38, 27 June 2024
Supported platforms:
Available since: Gideros 2017.10
Description
Adds support for Ogg audio and Theora video.
Examples
A Video Sprite
Theora=require "Theora"
local videoSource = Theora.new("videos/file_example_OGG_480_1_7mg.ogg")
local videoStream = videoSource:play()
local videoSprite = videoStream:getVideo()
videoSprite:setPosition(0, 64)
stage:addChild(videoSprite)
Recording your mic and camera to an .ogg video file
-- Microphone plugin, for recording in gideros
require "microphone"
-- Camera plugin, to get images from
require "camera"
-- Theora system (from ogg plugin)
local theora=require "theora.core"
--Locate available cameras
lst=Camera.availableDevices()
for k,cam in ipairs(lst) do
print("#"..k.." Desc:"..cam.description.." Pos:"..cam.position.." Dev:"..cam.name)
end
-- Pick the first available
local cname=lst[1].name
cw,ch=640,480
--Theora needs full 16x16 blocks
ch=(ch+15)&~15
cw=(cw+15)&~15
--Create texture and start camera
Camera.texture=RenderTarget.new(cw,ch)
Camera.start(Camera.texture,cname)
--Set our stage size
application:setLogicalDimensions(cw,ch)
--Show our live video
local b=Bitmap.new(Camera.texture)
stage:addChild(b)
--Prepare for recording
local mic=Microphone.new("",24000,2,16)
mic:setOutputFile("|T|mic.ogg")
--Laucnh recording process
Core.asyncCall(function()
--Wait a frame and disable auto yield
Core.yield(true)
--Start recording and get recording stream id
mic:start()
local id=mic:getStreamId()
--Encode video header immediately, before audio data gets encoded
--Parameters are:
-- . stream id
-- . codec name
-- . frame rate (here 30fps)
-- . image width
-- . image height
-- . image format (use 3 for now, nothing else is supported)
-- . image quality
theora.beginVideo(id,"theora",30,cw,ch,3,0.6)
-- Now encode 120 video frames, every other gideros frame (60fps->30fps)
for i=1,120 do
--Parameters:
-- . stream id
-- . frame id (zero based)
-- . image texture
-- . end of stream indicator
theora.encodeVideoFrame(id,(i-1),Camera.texture,(i==120))
Core.yield(true)
Core.yield(true)
end
-- Stop recording
mic:stop()
-- For testing, read encoded file and print its size
local f=io.open("|T|mic.ogg","rb")
local ct=f:read("*all")
f:close()
print("Ended",#ct)
end)
MethodsTheora.new creates a new Ogg/Theora object |
EventsConstants |