小编Gra*_*ant的帖子

关于在C#中设置FIle Writer的问题

我在C#中使用DirectShowLib.我想在C#中使用File Writer来设置文件输出.我想使用File Writer,因为Graph.SetOutputFileName()不会连接到我的编码器,但File Writer会.如何在C#中设置文件编写器保存的文件?

我尝试在DxPropPages示例中提取其属性页,但是不会出现File Writer.

c# directshow directshow.net

6
推荐指数
1
解决办法
2107
查看次数

寻找信息来提高代码速度

我有一些代码可以从720p和24fps的摄像头流式传输视频.我试图在代码中捕获这个流,并最终通过将压缩的jpegs放在mjpeg等中来创建它的视频.我遇到的问题是这个整体代码不够快,无法以每帧24 fps或.04秒的速度创建.

运用

Stopwatch();
Run Code Online (Sandbox Code Playgroud)

我发现循环的内部每个循环需要.000000000022秒.

每个循环完成循环的外部需要.0000077秒.

我发现从开始到图像保存的整个功能每次运行运行.21秒.

从内部循环计算完成图像:

.000000000022 x 640 = .000000001408 seconds
.000000001408 x 360 = .00000050688  seconds
Run Code Online (Sandbox Code Playgroud)

从外部循环计算到完成图像:

.0000077 x 360 = .002772 seconds
Run Code Online (Sandbox Code Playgroud)

如果我可以创建一个与我将被设置的时间相关的图像,但运行整个代码的代码需要.21秒来完成所有代码

temp_byte1 = main_byte1;
temp_byte2 = main_byte2;

timer1.Reset();
timer1.Start();

Bitmap mybmp = new Bitmap(1280, 720);
BitmapData BPD = mybmp.LockBits(new Rectangle(0, 0, 1280, 720), ImageLockMode.WriteOnly, mybmp.PixelFormat);
IntPtr xptr = BPD.Scan0;
IntPtr yptr = BPD.Scan0;
yptr = new IntPtr( yptr.ToInt64() + (1280 * 720 * 2));
int bytes = Math.Abs(BPD.Stride);
byte[][] rgb = new byte[720][]; …
Run Code Online (Sandbox Code Playgroud)

c# optimization performance

6
推荐指数
1
解决办法
1351
查看次数

我使用GMFBridge.DLL正确预览/捕获流吗?

我正在尝试使用GMFBuilder,以便我可以预览来自网络摄像头的流并定期保存,而无需重新启动整个图形.但是,我不确定这是否正确,我试图按照示例,但代码已更新,事情已发生变化.

我试着创造:

WEbcam -> Smart Tee (preview) -> AVI Decompressor -> Video Renderer
          Smart Tee (Capture) -> BridgeSinkFilter
Run Code Online (Sandbox Code Playgroud)

并且:

BridgeSourceFilter -> ffdshow video encoder -> haali mastroska muxer 
Run Code Online (Sandbox Code Playgroud)

(只是因为它易于使用)

关于让代码正常运行的输入将非常感激.

    private void button2_Click(object sender, EventArgs e)
    {
        IGraphBuilder firstGraph = (IGraphBuilder)new FilterGraph();
        IGraphBuilder secondGraph = (IGraphBuilder)new FilterGraph();

        IBaseFilter BridgeSinkFilter;
        IBaseFilter BridgeSourceFilter;

        IBaseFilter Source;
        IBaseFilter Mux;
        IBaseFilter FileWriter;

        IGMFBridgeController bridge = (IGMFBridgeController)new GMFBridgeController();

        bridge.AddStream(1, eFormatType.eMuxInputs, 1);

        BridgeSinkFilter = (IBaseFilter)bridge.InsertSinkFilter(firstGraph);

        Source = FindFilter(FilterCategory.VideoInputDevice, "SG330");
        firstGraph.AddFilter(Source, "source");

        IBaseFilter SmartTee = FindFilter(FilterCategory.LegacyAmFilterCategory, "Smart Tee"); …
Run Code Online (Sandbox Code Playgroud)

c# directshow directshow.net

4
推荐指数
1
解决办法
2128
查看次数

有没有办法在程序中伪造DirectShow过滤器?

我有一个IP摄像头,它接收一个包含网络图像的字符缓冲区.我无法访问它,直到我在程序中设置它的连接.我正在尝试剖析Windows源代码过滤器代码并且我的速度不是很快,所以我想我是否可以只使用这样的缓冲区并将其转换为可以将引脚连接到AVISplitter或类似于Directshow的东西/.净

(video buffer from IP Cam) -> (???) -> (AVI Splitter) -> (Profit)
Run Code Online (Sandbox Code Playgroud)

更新

我有我的程序在命名空间中捕获视频,我从GSSF的自己的命名空间中获得此代码.我将ptr与cam命名空间中的图像传递给GSSF命名空间.这仅发生一次,但图形流从这一个图像流出,并且摄像机从网络流出.有没有办法不断地将缓冲区从cam传递给GSSF,或者我应该以某种方式组合命名空间?我尝试将主摄像头指针发送到GSSF,但它崩溃了,因为它访问指针并被写入.也许如果我抓住一个图像,通过指针,等待抓住一个新的?

*更新*

我缩小了我的代码,我不相信即使我现在正在查看命名空间.

namespace Cam_Controller
{
    static byte[] mainbyte = new byte[1280*720*2];
    static IntPtr main_ptr = new IntPtr();

    //(this function is threaded)
    static void Trial(NPvBuffer mBuffer, NPvDisplayWnd mDisplayWnd, VideoCompression compressor)
    {
        Functions function = new Functions();
        Defines define = new Defines();
        NPvResult operationalResult = new NPvResult();
        VideoCompression mcompressor = new VideoCompression();

        int framecount = 0;
        while (!Stopping && AcquiringImages)
        {
            Mutex lock_video = new …
Run Code Online (Sandbox Code Playgroud)

c# directshow directshow.net

3
推荐指数
1
解决办法
2100
查看次数

DateTime是否在C#中自行更新?

我正在尝试使用DateTime创建一个基于当前月/日的文件夹.在我初始化一个新的DateTime(2011,5,16,1,1,30)之后; 这会在每次运行程序时保持自身更新或重置吗?

c# datetime

1
推荐指数
1
解决办法
353
查看次数

为什么 ::CreateProcess(path,cmd,...) 失败并显示错误“找不到文件”?

我正在尝试让 C++ 程序调用一个已经制作的 C# 程序在后台运行。

STARTUPINFO info = {sizeof(info)};
PROCESS_INFORMATION processinfo;
DWORD error1 = GetLastError();
bool x = ::CreateProcess((LPCWSTR)"C:\Convert_Shrink.exe", GetCommandLine(), NULL, NULL, false, 0,NULL,NULL, &info, &processinfo);
DWORD error = GetLastError();
Run Code Online (Sandbox Code Playgroud)

在 CreateProcess 之前 error1 为 0,在 CreateProcess 之后 error 为 2

错误2:

ERROR_FILE_NOT_FOUND 2 (0x2) The system cannot find the file specified.
Run Code Online (Sandbox Code Playgroud)

我已将其更改为 C:\ \ incase 他们正在检查转义序列,但我仍然收到错误 2,我不知道为什么。

c++ winapi

1
推荐指数
1
解决办法
1万
查看次数