pub mod audio;
pub mod capture;
pub mod convert;
pub mod encoder;
pub mod fork;
pub mod mux;
pub mod pipeline;
pub mod stream;
pub use pipeline::{AudioConfig, Pipeline, PipelineConfig, RecordConfig};
use std::time::Duration;
pub struct CapturedFrame {
pub texture: windows::Win32::Graphics::Direct3D11::ID3D11Texture2D,
pub timestamp: Duration,
pub width: u32,
pub height: u32,
}
unsafe impl Send for CapturedFrame {}
#[derive(Clone, Copy, Debug)]
pub enum CaptureTarget {
Monitor(usize),
Window(isize),
}
#[derive(thiserror::Error, Debug)]
pub enum PipelineError {
#[error("windows API error: {0}")]
Windows(#[from] windows::core::Error),
#[error("no monitor at index {0}")]
MonitorNotFound(usize),
#[error("capture is not supported on this system")]
CaptureUnsupported,
#[error("capture channel closed")]
Stopped,
#[error("no hardware or software H.264 encoder MFT found")]
NoEncoderFound,
#[error("encoder input/output type negotiation failed: {0}")]
TypeNegotiation(String),
#[error("rtmp io error: {0}")]
Io(#[from] std::io::Error),
#[error("rtmp protocol error: {0}")]
Rtmp(String),
#[error("audio device error: {0}")]
Audio(String),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum AudioSource {
SystemLoopback,
Microphone,
}
pub struct AudioBuffer {
pub data: Vec<u8>,
pub timestamp: Duration,
pub sample_rate: u32,
pub channels: u16,
}
#[derive(Clone, Debug)]
pub struct StreamConfig {
pub url: String,
pub stream_key: String,
}
#[derive(Clone, Copy, Debug)]
pub struct VideoConfig {
pub width: u32,
pub height: u32,
pub fps: u32,
pub bitrate: u32,
pub keyframe_interval: u32,
}
impl Default for VideoConfig {
fn default() -> Self {
Self {
width: 1920,
height: 1080,
fps: 30,
bitrate: 6_000_000,
keyframe_interval: 60, }
}
}
pub type Result<T> = std::result::Result<T, PipelineError>;