Запись Flash Webcam FMS 4.5 на Mp4 приводит к ужасному качеству
Я успешно настроил запись веб-камеры на FLV с помощью FMS 4.5 Developer Edition, поэтому я хотел попробовать записать на Mp4 дальше. Я делаю тихое сохранение видеофайла, потому что цель здесь состоит в том, чтобы иметь возможность воспроизводить эти видео вне Flash/FMS. Я настроил программу, чтобы сохранить файл Mp4, сгенерированный FMS, но качество ужасное. Я вижу искажение зеленого цвета при захвате движения и сильную пикселизацию. Вот мой тестовый код приложения, который сохраняет видеофайл после 5 секунд записи. Может кто-нибудь указать, где я иду не так? Любая помощь с благодарностью.
package com
{
import flash.display.*;
import flash.net.*;
import flash.utils.Timer;
import flash.events.*;
import flash.filesystem.File;
import flash.media.*;
public class Main extends MovieClip
{
private var nc:NetConnection;
private var ns:NetStream;
private var nsPlayer:NetStream;
private var vid:Video;
private var vidPlayer:Video;
private var cam:Camera;
private var mic:Microphone;
private static const LOCAL_VIDEO:String = "myCamera";
private static const VIDEO_FPS:uint = 30;
private static const SAVE_FOLDER_NAME:String = "Saved_Videos";
private static const PATH_TO_FMS:String = "C:/Program Files/Adobe/Flash Media Server 4.5";
private var timer:Timer = new Timer(5000, 1);
public function Main()
{
addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(evt:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
nc.connect("rtmp://localhost/PublishLive/myCamera");
}
function onNetStatus(evt:NetStatusEvent):void
{
if(evt.info.code == "NetConnection.Connect.Success")
{
publishCamera();
displayPublishingVideo();
timer.addEventListener(TimerEvent.TIMER_COMPLETE, timerCompleted);
timer.start();
}
}
private function timerCompleted(evt:TimerEvent)
{
trace("timer completed");
timer.stop();
ns.close();
ns = null;
var saveFile:File = new File(PATH_TO_FMS + "/applications/PublishLive/streams/" + LOCAL_VIDEO + "/" + LOCAL_VIDEO + ".mp4");
var fileName:String = "Video" + ".mp4";
var dir:File = File.documentsDirectory.resolvePath(SAVE_FOLDER_NAME);
dir.createDirectory();
var fileToSave = dir.resolvePath(fileName);
if(fileToSave.exists)
{
fileToSave.deleteFile();
}
saveFile.copyTo(fileToSave, true);
}
private function publishCamera()
{
var h264Settings:H264VideoStreamSettings = new H264VideoStreamSettings();
h264Settings.setProfileLevel(H264Profile.BASELINE, H264Level.LEVEL_3_1);
cam = Camera.getCamera();
cam.setMode(stage.stageWidth, stage.stageHeight, VIDEO_FPS, true);
cam.setQuality(0, 90);
cam.setKeyFrameInterval(15);
cam.setMotionLevel(100);
mic = Microphone.getMicrophone();
mic.setSilenceLevel(0);
mic.rate = 11;
ns = new NetStream(nc);
ns.videoStreamSettings = h264Settings;
ns.attachCamera(cam);
ns.attachAudio(mic);
ns.publish("mp4:myCamera.mp4", "record");
}
private function displayPublishingVideo():void
{
vid = new Video();
vid.width = stage.stageWidth;
vid.height = stage.stageHeight;
vid.attachCamera(cam);
addChild(vid);
}
}
}
2 ответа
Итак, я отвечаю на свой вопрос. Я нашел ответ здесь вместе со ссылкой на инструмент для обработки: Adobe Help site
Вы должны конвертировать файлы после записи, используя инструмент постобработки, чтобы их можно было просматривать в других видеопроигрывателях.
Изменить: VLC действительно может воспроизвести необработанный файл, поэтому я сначала подумал, что это проблема качества!
Вы можете попытаться изменить качество видео потока VideoStreamSettings.setQuality(bandwidth:int, quality:int)
( ссылка).
Вы только установите один из bandwidth
или же quality
значения и оставьте другое значение 0. Я бы попытался установить пропускную способность (измеряется в байтах в секунду) на 750000 (6 Мбит / с), что должно быть достаточно для чего-либо меньше, чем Full HD.
Итак, в вашем случае вы можете попробовать:
h264Settings.setQuality(750000, 0);