PDA

Просмотр полной версии : низкое качество видео с вебки


neonoviiwolf
24.04.2015, 03:42
Доброго!
Решил немного побаловаться с вебкой, набросал простенький код, что бы подключиться к вебке, но появилась проблема, аир выводит изображение в крайне паршивом качестве, реально камера может намного больше (в других приложениях, хоть тот же скайп, качество видео значительно лучше), в чём может быть проблема?

Добавлено через 3 минуты
ещё вопрос, как поминаю, одним аиром не обойтись, если я хочу записывать видео?

Добавлено через 14 минут
с первым вопросом разобрался, ответ тут (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/media/Camera.html#setMode()) ищем setMode

caseyryan
24.04.2015, 08:00
http://www.joristimmerman.be/wordpress/2008/12/18/flvrecorder-record-to-flv-using-air/

undefined
24.04.2015, 10:15
ещё вопрос, как поминаю, одним аиром не обойтись, если я хочу записывать видео?
Да, понадобится еще какой-нибудь сервер(можно на локалхосте).Например этот (https://github.com/Red5/red5-server)
Устанавливаешь, запускаешь. Вот код "шпионской " флэшки.
import flash.media.*;
import flash.net.*;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.events.ActivityEvent;

var mic:Microphone = Microphone.getMicrophone();
var cam:Camera = Camera.getCamera();
cam.setMotionLevel(25,5000);
cam.setMode(320,240,30,false);
cam.addEventListener(ActivityEvent.ACTIVITY,hMotion,false,0,true);
//mic.setLoopBack(true);
var nc:NetConnection = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS, hNS,false,0,true);
var ns:NetStream;
//reconnect();
var video:Video=new Video(stage.stageWidth,stage.stageHeight);
addChild(video);
addChild(log_tf);
log_tf.text="";
video.attachCamera(cam);
function hMotion(e:ActivityEvent):void {
if (e.activating) {
log("camera on");
if (!nc.connected)
reconnect();
} else {
log("camera off");
if (nc.connected) nc.close();
}
}
function reconnect():void {
if (nc.connected) nc.close();
nc.connect("rtmp://127.0.0.1");
}
function hNS(e:NetStatusEvent):void{
log(e.info.code);
switch(e.info.code){
case "NetConnection.Connect.Success":
hConnect();
break;
case "NetConnection.Connect.Closed":
break;
}
}
function hConnect():void {
ns=new NetStream(nc);
// add a listener so we know when our stuff is ready for recording
ns.addEventListener(NetStatusEvent.NET_STATUS, hNS,false,0,true);
ns.client={onMetaData:function(e) {trace("metadata:",e);trace(ns.bufferTime);}};
ns.attachAudio(mic);
ns.attachCamera(cam);
var date:Date=new Date();
var h=date.getHours();
var m=date.getMinutes();
var s=date.getSeconds();
var d=date.getDay();
var mo=date.getMonth();
if (h<10) h="0"+h;
if (m<10) m="0"+m;
if (s<10) s="0"+s;
if (d<10) d="0"+d;
if (mo<10) mo="0"+mo;
ns.publish(h+"-"+m+"-"+s+"_"+d+"_"+mo+"_"+date.getFullYear(), 'record');
}
function log(s:String):void {
log_tf.appendText(((log_tf.text.length==0)?"":"\n")+s);
log_tf.scrollV=log_tf.numLines;
}
log_tf - обычное текстовое поле для логирования (должно уже лежать на сцене).Ну и red5 должен уже стоять на локалхосте.
Флэшка ждет пока вебка не заметит движение.Как заметила - начинается запись. Готовые flv складываются в папочки с соответствующими датами где-то внутри red5
upd:Чувствительность камеры выставляется тут
cam.setMotionLevel(25,5000);

neonoviiwolf
27.04.2015, 02:24
Спасибо за отзывы!
Я не очень силён в AS3, переделал код, что бы работал в FD, но вот щас столкнулся с проблемой, наверно простой
log_tf - обычное текстовое поле для логирования (должно уже лежать на сцене)
а в FD это как сделать? Ну я могу во флеш проф выгрузить библиотеку swc, а что нужно в эту библиотеку запихнуть? Я вон ради интереса выгрузил простой мувик с таким именем, вроде даж как-то стартует, но сразу виснет, а FD ругается на "exception, information=TypeError: Error #1006: appendText is not a function." Помогите плиз
package
{

import flash.display.Sprite;
import flash.events.NetStatusEvent;
import flash.media.*;
import flash.net.*;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.events.ActivityEvent;

[SWF(width="800",height="600",frameRate="60",backgroundColor="0x1B1B1B")]

public class Main extends Sprite
{
var mic:Microphone = Microphone.getMicrophone();
var cam:Camera = Camera.getCamera();
var nc:NetConnection = new NetConnection();
var ns:NetStream;
var log_tf:log_tf_mc = new log_tf_mc();

public function Main()
{
cam.setMotionLevel(25, 5000);
cam.setMode(320, 240, 30, false);
cam.addEventListener(ActivityEvent.ACTIVITY, hMotion, false, 0, true);

nc.addEventListener(NetStatusEvent.NET_STATUS, hNS, false, 0, true);

var video:Video = new Video(stage.stageWidth, stage.stageHeight);
addChild(video);
addChild(log_tf);
log_tf.text = "";
video.attachCamera(cam);
}

function hMotion(e:ActivityEvent):void
{

if (e.activating)
{
log("camera on");
if (!nc.connected)
reconnect();
}
else
{
log("camera off");
if (nc.connected)
nc.close();
}
}

function reconnect():void
{
if (nc.connected)
nc.close();
nc.connect("rtmp://127.0.0.1");
}

function hNS(e:NetStatusEvent):void
{
log(e.info.code);
switch (e.info.code)
{
case "NetConnection.Connect.Success":
hConnect();
break;
case "NetConnection.Connect.Closed":
break;
}
}

function hConnect():void
{
ns = new NetStream(nc);
// add a listener so we know when our stuff is ready for recording
ns.addEventListener(NetStatusEvent.NET_STATUS, hNS, false, 0, true);
ns.client = {onMetaData: function(e)
{
trace("metadata:", e);
trace(ns.bufferTime);
}};
ns.attachAudio(mic);
ns.attachCamera(cam);
var date:Date = new Date();
var h = date.getHours();
var m = date.getMinutes();
var s = date.getSeconds();
var d = date.getDay();
var mo = date.getMonth();
if (h < 10)
h = "0" + h;
if (m < 10)
m = "0" + m;
if (s < 10)
s = "0" + s;
if (d < 10)
d = "0" + d;
if (mo < 10)
mo = "0" + mo;
ns.publish(h + "-" + m + "-" + s + "_" + d + "_" + mo + "_" + date.getFullYear(), 'record');
}

function log(s:String):void
{
log_tf.appendText(((log_tf.text.length == 0) ? "" : "\n") + s);
log_tf.scrollV = log_tf.numLines;
}
}
}

undefined
27.04.2015, 11:34
так ты добавляешь не само текстовое поле, а мувиклип с текстовым полем, у него естественно нет методов текстФилда.Попробуй так:
в объявлениях верни
var log_tf:TextField;
И дальше в самом начале функции Main:

var mc:log_tf_mc = new log_tf_mc();
log_tf=mc.getChildAt(0) as TextField;

Ток проследи чтоб внутри мувиклипа log_tf_mc тектовое поле было единственным ребенком.
Если опять не заведется - убирай нах все упоминания о log_tf и меняй функцию log на

function log(s:String):void
{
trace(s);
}