Commit 02accdae by 景炳强

1新增单路延迟 2新增裁切缩放参数

parents fbdd51ed 2c2864a0
......@@ -75,6 +75,7 @@
<Link>
<AdditionalLibraryDirectories>.\ThirdParty\libyuv\lib;.\ThirdParty\OpenCV\x64\vc15\lib;.\ThirdParty\NewTek\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>Processing.NDI.Lib.Advanced.x64.lib;opencv_world460.lib;yuv.lib;jpeg.lib;%(AdditionalDependencies);$(Qt_LIBS_)</AdditionalDependencies>
<UACExecutionLevel>RequireAdministrator</UACExecutionLevel>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'" Label="Configuration">
......
......@@ -23,7 +23,7 @@ class DeckLinkInputDevice : public QObject, public IDeckLinkInputCallback
public:
using DeckLinkDisplayModeQueryFunc = std::function<void(IDeckLinkDisplayMode*)>;
DeckLinkInputDevice(QObject* parent, ComPtr<IDeckLink>& deckLink);
DeckLinkInputDevice(QObject* parent, ComPtr<IDeckLink>& deckLink, int index);
virtual ~DeckLinkInputDevice();
// IUnknown interface
......@@ -84,6 +84,8 @@ private:
//std::mutex mutex;
//std::thread thd;
int Index;
};
class DeckLinkInputFormatChangedEvent : public QEvent
......
......@@ -20,7 +20,7 @@ public:
DeckLinkInputPage();
virtual ~DeckLinkInputPage();
void SetPreviewSize(QSize previewSize);
void SetPreviewSize(QSize previewSize, int index);
void customEvent(QEvent* event) override;
......@@ -70,4 +70,6 @@ private:
QComboBox* VideoFormatCombo;
QCheckBox* AutoDetectCheckBox;
QLabel* NDINameLabel;
int Index;
};
\ No newline at end of file
......@@ -59,7 +59,8 @@ public:
public slots:
void AddAudioFrame(std::shared_ptr<AudioPacket> audio_packet);
void AddFrame(std::shared_ptr<Image> image);
private:
void InitResource();
private:
std::atomic<ULONG> RefCount;
PlaybackState state;
......@@ -101,4 +102,7 @@ private:
int64_t current_video_time = 0;
int64_t current_sleep_ms = 0;
qint32 Index;
qint32 Device_id;
qint32 output_deley_ms;//
qint32 audio_max_size;
};
......@@ -195,6 +195,7 @@ private:
static int s_count;
int idx;
int output_deley_time;
int sendFrames;
int64_t sendStartTime;
......
......@@ -7,7 +7,7 @@ class AudioPacket : public QObject
{
Q_OBJECT
public:
AudioPacket(IDeckLinkAudioInputPacket* audioPacket,qint64& timestamp);
AudioPacket(IDeckLinkAudioInputPacket* audioPacket,qint64& timestamp,qint32 channel);
~AudioPacket();
public:
......
#pragma once
#include "DeckLinkAPI.h"
#include <QDateTime.h>
long GetRowBytesFromPixelFormat(long width, BMDPixelFormat pixelFormat);
static QString GetCurrDateTimeStr()
{
QString time_format = "yyyy-MM-dd HH:mm:ss";
QDateTime a = QDateTime::currentDateTime();
QString as = a.toString(time_format);
return as;
}
......@@ -4,8 +4,11 @@
#include "Utils/Platform.h"
#include "BlackMagicDesign/DeckLinkInputDevice.h"
#include "Utils/Common.h"
DeckLinkInputDevice::DeckLinkInputDevice(QObject* parent, ComPtr<IDeckLink>& device)
extern int AudioChannel;
DeckLinkInputDevice::DeckLinkInputDevice(QObject* parent, ComPtr<IDeckLink>& device, int index)
: RefCount(1),
Owner(parent),
DeckLink(device),
......@@ -16,7 +19,8 @@ DeckLinkInputDevice::DeckLinkInputDevice(QObject* parent, ComPtr<IDeckLink>& dev
bApplyDetectedInputMode(false),
bLastValidFrameStatus(false),
SupportedInputConnections(bmdVideoConnectionUnspecified),
SelectedInputConnection(bmdVideoConnectionUnspecified)
SelectedInputConnection(bmdVideoConnectionUnspecified),
Index(index)
{
//thd = std::thread(&DeckLinkInputDevice::ForwardThread, this);
}
......@@ -78,6 +82,9 @@ HRESULT DeckLinkInputDevice::VideoInputFrameArrived(IDeckLinkVideoInputFrame* vi
ComPtr<IDeckLinkVideoInputFrame> frame = ComPtr<IDeckLinkVideoInputFrame>(videoFrame);
//emit ArrivedFrame(frame);
if (videoFrame && Capture) {
unsigned flags = videoFrame->GetFlags();
if (flags & bmdFrameHasNoInputSource)
qDebug() << GetCurrDateTimeStr() << "index: " << Index << " DeckLinkInputDevice get video frame No input source " << hex << flags << " ------------ \n";
auto cur_time = QDateTime::currentMSecsSinceEpoch();
Capture->AddFrame(frame, cur_time);
}
......@@ -85,7 +92,7 @@ HRESULT DeckLinkInputDevice::VideoInputFrameArrived(IDeckLinkVideoInputFrame* vi
{
//qDebug() << "DeckLinkInputDevice get audio packet--------------" << "\n";
auto cur_time = QDateTime::currentMSecsSinceEpoch();
std::shared_ptr<AudioPacket> audio_ptr = std::make_shared<AudioPacket>(audioPacket, cur_time);
std::shared_ptr<AudioPacket> audio_ptr = std::make_shared<AudioPacket>(audioPacket, cur_time, AudioChannel);
emit PushAudioFrame(audio_ptr);
}
......@@ -229,7 +236,7 @@ bool DeckLinkInputDevice::StartCapture(BMDDisplayMode displayMode, IDeckLinkScre
if (DeckLinkInput->EnableVideoInput(displayMode, bmdFormat10BitYUV, videoInputFlags) != S_OK)
return false;
if (DeckLinkInput->EnableAudioInput(bmdAudioSampleRate48kHz, bmdAudioSampleType16bitInteger, 2) != S_OK)
if (DeckLinkInput->EnableAudioInput(bmdAudioSampleRate48kHz, bmdAudioSampleType16bitInteger, AudioChannel) != S_OK)
return false;
// Set the capture
......
......@@ -33,7 +33,7 @@ namespace
}
}
DeckLinkInputPage::DeckLinkInputPage() : SelectedDevice(nullptr), NDIOutput(nullptr)
DeckLinkInputPage::DeckLinkInputPage() : SelectedDevice(nullptr), NDIOutput(nullptr), Index(0)
{
FormLayout = new QFormLayout(this);
......@@ -85,10 +85,11 @@ DeckLinkInputPage::~DeckLinkInputPage()
}
void DeckLinkInputPage::SetPreviewSize(QSize previewSize)
void DeckLinkInputPage::SetPreviewSize(QSize previewSize, int index)
{
PreviewView->resize(previewSize);
PreviewView->Clear();
Index = index;
}
void DeckLinkInputPage::customEvent(QEvent* event)
......@@ -246,7 +247,7 @@ void DeckLinkInputPage::InputDeviceChanged(int selectedDeviceIndex)
void DeckLinkInputPage::RequestedDeviceGranted(ComPtr<IDeckLink>& device)
{
START_SLOT_TIME_COUNTER
SelectedDevice = MakeComPtr<DeckLinkInputDevice>(this, device);
SelectedDevice = MakeComPtr<DeckLinkInputDevice>(this, device, Index);
// Register profile callback with newly selected device`s profile manager
if (SelectedDevice)
......
#include "BlackMagicDesign/DeckLinkOutputDevice.h"
#include <QDebug>
#include <stdexcept>
#include <map>
#include "BlackMagicDesign/ScreenPreviewCallback.h"
#include "BlackMagicDesign/ReferenceTime.h"
extern int OutputDeleyTime;
extern int OutputPlayMode;
extern int AudioChannel;
extern std::map<qint32, qint32> map_output_delay;
#define OUTPUT_1080 1
#define AUDIOMAXSIZE (OutputDeleyTime + 3) * 50
DeckLinkOutputDevice::DeckLinkOutputDevice(ComPtr<IDeckLink>& decklink, int videoPrerollSize,int index)
: RefCount(1),
state(PlaybackState::Idle),
......@@ -25,7 +29,9 @@ DeckLinkOutputDevice::DeckLinkOutputDevice(ComPtr<IDeckLink>& decklink, int vide
// Check that device has an output interface, this will throw an error if using a capture-only device such as DeckLink Mini Recorder
if (!deckLinkOutput)
throw std::runtime_error("DeckLink device does not have an output interface.");
current_sleep_ms = OutputDeleyTime * 1000;
//current_sleep_ms = OutputDeleyTime * 1000;
InitResource();
}
// IUnknown methods
......@@ -183,13 +189,13 @@ bool DeckLinkOutputDevice::StartPlayback(BMDDisplayMode displayMode, bool enable
}
if (deckLinkOutput->EnableVideoOutput(outputDisplayMode, outputFlags) != S_OK)
if (deckLinkOutput->EnableVideoOutput(outputDisplayMode, bmdVideoOutputFlagDefault) != S_OK)
{
qDebug() << "call EnableVideoOutput fuc is failure" << "\n";
return false;
}
if (deckLinkOutput->EnableAudioOutput(bmdAudioSampleRate48kHz,bmdAudioSampleType16bitInteger,2,bmdAudioOutputStreamTimestamped) != S_OK)
if (deckLinkOutput->EnableAudioOutput(bmdAudioSampleRate48kHz,bmdAudioSampleType16bitInteger, AudioChannel,bmdAudioOutputStreamTimestamped) != S_OK)
{
qDebug() << "call EnableAudioOutput fuc is failure" << "\n";
return false;
......@@ -337,9 +343,9 @@ bool DeckLinkOutputDevice::getReferenceSignalMode(BMDDisplayMode* mode)
auto now_time = QDateTime::currentMSecsSinceEpoch();
auto dever_time = now_time - outputImage->getInputFrameCurTimeStamp();
//qDebug() << "index:"<<Index << "input frame cur time:" << outputImage->getInputFrameCurTimeStamp() << " now time:" << now_time << " dever time:" << dever_time << "\n";
if (dever_time < OutputDeleyTime * 1000)
if (dever_time < output_deley_ms)
{
current_sleep_ms = OutputDeleyTime * 1000 - dever_time;
current_sleep_ms = output_deley_ms - dever_time;
std::this_thread::sleep_for(std::chrono::milliseconds(current_sleep_ms));
}
......@@ -359,13 +365,34 @@ bool DeckLinkOutputDevice::getReferenceSignalMode(BMDDisplayMode* mode)
//videoFrame->setOutputFrameScheduledReferenceTime(ReferenceTime::getSteadyClockUptimeCOunt());
//if(deckLinkOutput->ScheduleVideoFrame(outputFrame.Get(), outputFrame->getVideoStreamTime(), frameDuration, frameTimescale) != S_OK)
if(deckLinkOutput->DisplayVideoFrameSync(videoFrame.Get()))
auto ret = deckLinkOutput->DisplayVideoFrameSync(videoFrame.Get());
if (ret != S_OK)
{
fprintf(stderr, "Unable to schedule output video frame\n");
qDebug() << "Unable to schedule output video frame"<<"\n";
break;
if (ret == E_ACCESSDENIED) {
qDebug() << "The video output is not enabled." << "\n";
}
else if (ret == E_INVALIDARG)
{
qDebug() << "The frame attributes are invalid." << "\n";
}
else if (ret == E_FAIL)
{
qDebug() << "Failure." << "\n";
}
else
{
qDebug() << "other error code." << "\n";
}
}
//if(deckLinkOutput->DisplayVideoFrameSync(videoFrame.Get()))
//{
// fprintf(stderr, "Unable to schedule output video frame\n");
// qDebug() << "Unable to schedule output video frame"<<"\n";
// //break;
// continue;
//}
//scheduledFramesList.push_back(outputFrame);
......@@ -391,9 +418,9 @@ bool DeckLinkOutputDevice::getReferenceSignalMode(BMDDisplayMode* mode)
auto audio_tm = audio_packet->frame_time_stamp;
auto dever_time = now_time - audio_tm;
//qDebug() << "index:" << Index << "input frame cur time:" << outputImage->getInputFrameCurTimeStamp() << " now time:" << now_time << " dever time:" << dever_time << "\n";
if (dever_time < OutputDeleyTime * 1000)
if (dever_time < output_deley_ms)
{
current_sleep_ms = OutputDeleyTime * 1000 - dever_time;
current_sleep_ms = output_deley_ms - dever_time;
std::this_thread::sleep_for(std::chrono::milliseconds(current_sleep_ms));
}
......@@ -507,14 +534,13 @@ void DeckLinkOutputDevice::AddFrame(std::shared_ptr<Image> image)
return;
if (outputVideoFrameQueue.Size() >= 4)
qDebug() << "index:" << Index << "DeckLinkOutputDevice::AddFrame video---qsize:" << "\t" << outputVideoFrameQueue.Size() << "\n";
qDebug() << "DeckLinkOutputDevice::AddFrame video---qsize:" << "\t" << outputVideoFrameQueue.Size() << "\n";
if (outputVideoFrameQueue.Size() > AUDIOMAXSIZE)
if (outputVideoFrameQueue.Size() > audio_max_size)
{
outputVideoFrameQueue.Reset();
}
outputVideoFrameQueue.Push(image);
if(image) outputVideoFrameQueue.Push(image);
END_SLOT_TIME_COUNTER
}
void DeckLinkOutputDevice::AddAudioFrame(std::shared_ptr<AudioPacket> audio_packet)
......@@ -523,7 +549,7 @@ void DeckLinkOutputDevice::AddAudioFrame(std::shared_ptr<AudioPacket> audio_pack
if (outputAudioFrameQueue.Size() >= 4)
qDebug() << "index:" << Index << "DeckLinkOutputDevice::AddAudioFrame audio---qsize:" << "\t" << outputAudioFrameQueue.Size() << "\n";
if (outputAudioFrameQueue.Size() > AUDIOMAXSIZE)
if (outputAudioFrameQueue.Size() > audio_max_size)
{
outputAudioFrameQueue.Reset();
}
......@@ -533,3 +559,37 @@ void DeckLinkOutputDevice::AddAudioFrame(std::shared_ptr<AudioPacket> audio_pack
}
END_SLOT_TIME_COUNTER
}
void DeckLinkOutputDevice::InitResource()
{
if (deckLink)
{
dlstring_t displayName;
QString deviceName;
if (deckLink->GetDisplayName(&displayName) == S_OK)
{
deviceName = DlToQString(displayName);
DeleteString(displayName);
QRegExp rx("\\d+");
rx.indexIn(deviceName, 0);
QString deviceIdStr;
deviceIdStr = rx.cap(0);
Device_id = deviceIdStr.toInt();
if (Device_id > 4)
{
int key = Device_id - 4;
int value = map_output_delay[key];
if (value < 1 * 1000)
{
output_deley_ms = 1 * 1000;
}
else output_deley_ms = value;
current_sleep_ms = output_deley_ms;
audio_max_size = (output_deley_ms / 1000 + 3) * 50;
}
}
}
}
\ No newline at end of file
......@@ -272,7 +272,8 @@ void DeckLinkOutputPage::RequestedDeviceGranted(ComPtr<IDeckLink>& device)
void DeckLinkOutputPage::FormatChanged(BMDDisplayMode displayMode)
{
BMDDisplayMode displayMode_ = displayMode;
BMDPixelFormat pixelFormat = bmdFormat10BitYUV;
//BMDPixelFormat pixelFormat = bmdFormat10BitYUV;
BMDPixelFormat pixelFormat = bmdFormat8BitBGRA;
SelectedDevice->StartPlayback(displayMode_, false, pixelFormat, false, PreviewView->GetDelegate());
}
......
......@@ -5,6 +5,7 @@
#include <QDebug>
#include <qglobal.h>
#include <vector>
#include <map>
#include "Utils/Platform.h"
#include "Utils/CustomEvents.h"
#include "Utils/Image.h"
......@@ -17,13 +18,25 @@ int FrameRate = 50;
int PrvwFlag = 0;
int OutputPlayMode = 0;
int BlackBottomHeight = 240;
int AudioChannel = 2;
int ScaleMode = 0;
qint64 StartTimeStamp = 0;
std::map<qint32, qint32> map_output_delay;
std::map<qint32, qint32> map_scale_mode;
int main_ver = 1;
int mid_ver = 0;
int small_ver = 2;
MomentaMedia::MomentaMedia(QWidget *parent)
: QMainWindow(parent)
{
ReadSettings();
ui.setupUi(this);
std::string version = std::to_string(main_ver) + "." + std::to_string(mid_ver) + "." + std::to_string(small_ver);
std::string title = "MomentaMedia(v" + version + ")";
setWindowTitle(QString::fromStdString(title));
StartTimeStamp = QDateTime::currentMSecsSinceEpoch();
setWindowFlags(Qt::Window | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint);
......@@ -59,7 +72,7 @@ MomentaMedia::MomentaMedia(QWidget *parent)
for(size_t i = 0; i < InputDevicePages.size(); i++)
{
InputDevicePages[i]->SetPreviewSize(previewViewSize);
InputDevicePages[i]->SetPreviewSize(previewViewSize, i);
PreviewLayout->addWidget(InputDevicePages[i]->GetPreviewView(), (int)i / 4, (int)i % 4);
connect(InputDevicePages[i], &DeckLinkInputPage::RequestDeckLink, this, std::bind(&MomentaMedia::RequestInputDevice, this, InputDevicePages[i], std::placeholders::_1));
......@@ -274,6 +287,16 @@ void MomentaMedia::RemoveDevice(ComPtr<IDeckLink>& deckLink)
auto deviceIter = InputDevices.find(deckLink);
if (deviceIter != InputDevices.end())
{
{
dlstring_t displayName;
QString deviceName;
if (deckLink->GetDisplayName(&displayName) == S_OK)
{
deviceName = DlToQString(displayName);
DeleteString(displayName);
}
qDebug() << deviceName << " remove device!!!" << "\n";
}
deviceIter = InputDevices.erase(deviceIter);
// Check whether device to remove was selected device, if so then stop capture
......@@ -511,8 +534,8 @@ void MomentaMedia::ReadSettings()
QSettings settings(ini_path, QSettings::IniFormat);
settings.beginGroup("DELEYTIME");
OutputDeleyTime = settings.value("DELEY_TIME", "").toInt();
if (OutputDeleyTime < 1) OutputDeleyTime = 1;
else if (OutputDeleyTime > 20) OutputDeleyTime = 20;
if (OutputDeleyTime < 1 * 1000) OutputDeleyTime = 1 * 1000;
else if (OutputDeleyTime > 20 * 1000) OutputDeleyTime = 20 * 1000;
FrontDeleyTime = settings.value("FRONT_DELEY_TIME", "").toInt();
if (FrontDeleyTime < 1 || FrontDeleyTime > OutputDeleyTime) FrontDeleyTime = 1;
......@@ -523,9 +546,34 @@ void MomentaMedia::ReadSettings()
if (BlackBottomHeight < 0) BlackBottomHeight = 0;
else if (BlackBottomHeight > 480) BlackBottomHeight = 480;
AudioChannel = settings.value("AUDIO_CHANNEL").toInt();
if (AudioChannel <= 0 || AudioChannel > 20) AudioChannel = 2;
PrvwFlag = settings.value("PRVW_FLAG", "").toInt();
OutputPlayMode = settings.value("OUTPUT_PLAY_MODE", "").toInt();
for(int i = 1;i <= 4;i++)
{
std::string key = "DELEY_TIME_" + std::to_string(i);
int value = settings.value(QString::fromStdString(key), "").toInt();
if (value < 1 * 1000) value = 1 * 1000;
//else if (value > 60 * 1000) value = 60 * 1000;
map_output_delay[i] = value;
}
ScaleMode = settings.value("SCALE_MODE", "").toInt();
if (ScaleMode < 0) ScaleMode = 0;
else if (ScaleMode > 3) ScaleMode = 3;
for (int i = 1;i <= 4;i++)
{
std::string key = "SCALE_MODE_" + std::to_string(i);
int value = settings.value(QString::fromStdString(key), "").toInt();
if (value < 0) value = 0;
else if (value > 3) value = 3;
map_scale_mode[i] = value;
}
//qDebug() << "deleyTime=" << deleyTime << endl;
settings.endGroup();
}
\ No newline at end of file
......@@ -9,6 +9,9 @@ extern int OutputDeleyTime;
extern int FrameRate;
extern int FrontDeleyTime;
extern int BlackBottomHeight;
//extern int ScaleMode;
extern std::map<qint32, qint32> map_output_delay;
extern std::map<qint32, qint32> map_scale_mode;
ProcessThread::ProcessThread()
: sendFrames(0),
......@@ -18,6 +21,8 @@ ProcessThread::ProcessThread()
recvROIStartTime(QDateTime::currentMSecsSinceEpoch())
{
idx = s_count++;
int key = idx + 1;
output_deley_time = map_output_delay[key];
minTaskImageQueueSize = FrontDeleyTime * FrameRate;
}
......@@ -244,9 +249,9 @@ void ProcessThread::cutRunFront()
{
qDebug() << "idx:" << idx << "taskImageQueue size:"<< taskImageQueue.Size() <<",min_size:"<< min_size << endl;
}*/
while (taskImageQueue.Size() > (FrameRate * (OutputDeleyTime + FrontDeleyTime)))
while (taskImageQueue.Size() > (FrameRate * (output_deley_time / 1000 + FrontDeleyTime)))
{
qDebug() << "idx:" << idx << ",----------------lost Image size:" << taskImageQueue.Size() - (OutputDeleyTime + FrontDeleyTime) << endl;
qDebug() << "idx:" << idx << ",----------------lost Image size:" << taskImageQueue.Size() - (output_deley_time / 1000 + FrontDeleyTime) << endl;
taskImageQueue.Pop(image);
}
if (cutRuleMap.size() > CUTBUFFERMAXSIZE && image)
......@@ -382,9 +387,9 @@ void ProcessThread::cutRun()
}
}
}
while (taskImageQueue.Size() > (FrameRate * OutputDeleyTime))
while (taskImageQueue.Size() > (FrameRate * (output_deley_time / 1000)))
{
qDebug() << "idx:" << idx << ",----------------lost Image size:" << taskImageQueue.Size() - (FrameRate * OutputDeleyTime) << endl;
qDebug() << "idx:" << idx << ",----------------lost Image size:" << taskImageQueue.Size() - (FrameRate * output_deley_time / 1000) << endl;
taskImageQueue.Pop(image);
//qDebug() << "idx:" << idx << ",lost timestamp:" << image->getInputFrameCurTimeStamp() << "\n";
......@@ -503,10 +508,11 @@ void ProcessThread::WorkCutImage(std::shared_ptr<Image>& pImage, RoiMessage& roi
roi.X(), roi.Y(), 1920, 1080, roi.Width(), roi.Height(),
libyuv::kRotate90, libyuv::FOURCC_ARGB);
int key = idx + 1;
int scale_mode = map_scale_mode[key];
uint8_t* buff2 = new uint8_t[1440 * 1080 << 2];
libyuv::ARGBScale(buff1, (roi.Height() << 2), roi.Height(), roi.Width(),
buff2, 1440 << 2, 1440, 1080, libyuv::FilterMode::kFilterNone);
buff2, 1440 << 2, 1440, 1080, libyuv::FilterMode(scale_mode));
uint8_t* buff3 = new uint8_t[1920 * 1080 << 2];
memset(buff3, 0, (1920 * 1080 << 2));
......
#include "Utils/AudioPacket.h"
AudioPacket::AudioPacket(IDeckLinkAudioInputPacket* audioPacket, qint64& timestamp):frame_time_stamp(timestamp),channel(2)
AudioPacket::AudioPacket(IDeckLinkAudioInputPacket* audioPacket, qint64& timestamp, qint32 channel):frame_time_stamp(timestamp),channel(channel)
{
if (audioPacket)
{
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -4,10 +4,24 @@
;PRVW_FLAG 0-表示关闭预览 1-表示打开预览
;FRAME_RATE 表示帧率 如1080p50 50帧率 1080i50 25帧率
;OUTPUT_PLAY_MODE 输出sdi模式 0-表示和输入格式一样 1-表示1080i输出
;AUDIO_CHANNEL音频通道数 默认是2
;DELEY_TIME_1/_2/_3/_4 对应绑卡的四路输入接口的延迟时间 单位是毫秒 最小2000ms
;SCALE_MODE 取值分别是0、1、2、3 其中缩放质量由低到高 0质量最低 3质量最高
[DELEYTIME]
DELEY_TIME=2
FRONT_DELEY_TIME=1
FRAME_RATE=25
PRVW_FLAG=0
PRVW_FLAG=1
OUTPUT_PLAY_MODE=0
BLACK_BOTTOM_HEIGHT=0
AUDIO_CHANNEL=2
SCALE_MODE=0
SCALE_MODE_1=0
SCALE_MODE_2=1
SCALE_MODE_3=2
SCALE_MODE_4=3
DELEY_TIME=2000
DELEY_TIME_1=2000
DELEY_TIME_2=3000
DELEY_TIME_3=4000
DELEY_TIME_4=5000
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment