Difference between revisions of "Ogg"
From GiderosMobile
| (4 intermediate revisions by 2 users not shown) | |||
| Line 5: | Line 5: | ||
| === Description === | === Description === | ||
| − | Adds support for Ogg audio and Theora  | + | Adds support for Ogg audio and video (Theora). | 
| + | |||
| + | There are two ways to use the Ogg plugin: | ||
| + | * to read Ogg files use: | ||
| + | <syntaxhighlight lang="lua"> | ||
| + | local theora = require "Theora" | ||
| + | </syntaxhighlight> | ||
| + | * to encode/decode Ogg files use: | ||
| + | <syntaxhighlight lang="lua"> | ||
| + | -- Theora system | ||
| + | local theora = require "theora.core" | ||
| + | </syntaxhighlight> | ||
| === Example === | === Example === | ||
| − | < | + | '''Recording your mic and camera to an .ogg video file''' | 
| − | Theora=require " | + | <syntaxhighlight lang="lua"> | 
| − | local  | + | -- Microphone plugin, for recording in gideros | 
| − | local  | + | 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") | ||
| + | |||
| + | --Launch 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, 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> | ||
| {|- | {|- | ||
| Line 21: | Line 88: | ||
| === Methods === | === Methods === | ||
| [[Theora.new]] ''creates a new Ogg/Theora object''<br/><!--GIDEROSMTD:Theora.new(path) creates a new Ogg/Theora object--> | [[Theora.new]] ''creates a new Ogg/Theora object''<br/><!--GIDEROSMTD:Theora.new(path) creates a new Ogg/Theora object--> | ||
| + | [[Theora:getVideo]] ''reads video from an Ogg/Theora stream object''<br/><!--GIDEROSMTD:Theora:getVideo() reads video from an Ogg/Theora stream object--> | ||
| + | [[Theora:play]] ''creates a new Ogg/Theora stream object''<br/><!--GIDEROSMTD:Theora:play() creates a new Ogg/Theora stream object--> | ||
| | style="width: 50%; vertical-align:top;"| | | style="width: 50%; vertical-align:top;"| | ||
Latest revision as of 06:56, 26 August 2024
Supported platforms: 



Available since: Gideros 2017.10
Description
Adds support for Ogg audio and video (Theora).
There are two ways to use the Ogg plugin:
- to read Ogg files use:
local theora = require "Theora"
- to encode/decode Ogg files use:
-- Theora system
local theora = require "theora.core"
Example
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")
--Launch 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, 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 | 
