Files
DisplayFlow/demo/windows_sender/README.md

2.6 KiB

Windows Sender Demo

This is a simplified demo of the Windows Host sender for DisplayFlow.

It demonstrates:

  1. Screen Capture using Desktop Duplication API (DXGI).
  2. Hardware/Software H.264 Encoding using FFmpeg (switched from Media Foundation for better compatibility).
  3. Network Transmission using UDP.

Prerequisites

  • Windows 10/11
  • Visual Studio 2022 or later (with C++ Desktop Development)
  • CMake 3.10+
  • FFmpeg Development Libraries (Shared)
    • Ensure you have the include and lib directories.
    • Example path: D:\tools\ffmpeg-8.0.1-full_build-shared

Build

  1. Open a terminal (Developer Command Prompt for VS or PowerShell).

  2. Navigate to this directory:

    cd demo\windows_sender
    
  3. Create a build directory:

    mkdir build
    cd build
    
  4. Configure and Build (Replace path with your FFmpeg location):

    cmake .. -DFFMPEG_ROOT="D:/tools/ffmpeg-8.0.1-full_build-shared"
    cmake --build . --config Release
    

    Note: If your FFmpeg is installed elsewhere, change the path accordingly.

  5. Important: Copy FFmpeg DLLs to the executable directory.

    • Copy avcodec-*.dll, avutil-*.dll, swscale-*.dll, avformat-*.dll from your FFmpeg bin directory to demo\windows_sender\build\Release.

Run

Run the executable with optional arguments: Target IP, Port, and Output File.

.\Release\WindowsSenderDemo.exe [TargetIP] [Port] [OutputFile]

Examples

  1. Basic Streaming (Default: 127.0.0.1:8888):

    .\Release\WindowsSenderDemo.exe
    
  2. Specify Target:

    .\Release\WindowsSenderDemo.exe 192.168.1.100 8888
    
  3. Stream and Save to File (for debugging):

    .\Release\WindowsSenderDemo.exe 127.0.0.1 8888 debug.h264
    

    You can play the saved debug.h264 using VLC player to verify the encoding quality.

Implementation Details

  • ScreenCapture: Uses IDXGIOutputDuplication to capture desktop frames.
  • VideoEncoder:
    • Uses FFmpeg (libx264) for encoding.
    • Performs BGRA to YUV420P color conversion using libswscale.
    • Configured for low latency (zerolatency tune, ultrafast preset).
  • NetworkSender: Fragments the H.264 stream into UDP packets (MTU ~1400 bytes) and sends them to the target.

Protocol

The demo uses a simple custom protocol for feasibility verification:

  • Packet Header (Network Layer): FrameID (4B), FragID (2B), TotalFrags (2B).
  • Frame Header (Application Layer, in first fragment/reassembled): Timestamp (8B), Width (4B), Height (4B), Type (4B), Size (4B).
  • Payload: H.264 NAL units.