Private/ConvertFrom-SrsFile.ps1
|
function ConvertFrom-SrsFile { <# .SYNOPSIS Parses an SRS file and extracts metadata and track information. .PARAMETER FilePath Path to the SRS file .OUTPUTS [PSCustomObject] containing FileMetadata, Tracks, RawBytes, SegmentDataOffset #> [CmdletBinding()] param( [Parameter(Mandatory=$true)] [string]$FilePath ) if (-not (Test-Path $FilePath)) { throw "SRS file not found: $FilePath" } $bytes = [System.IO.File]::ReadAllBytes($FilePath) Write-Verbose "Read SRS file: $($bytes.Length) bytes" $offset = 0 $element = Get-EbmlElementFromBuffer -Buffer $bytes -Offset $offset Write-Verbose "Element at 0: $(ConvertTo-ByteString -Bytes $element.ElementID) ($($element.DataSize) bytes)" $offset += $element.TotalLength $element = Get-EbmlElementFromBuffer -Buffer $bytes -Offset $offset Write-Verbose "Element at ${offset}: $(ConvertTo-ByteString -Bytes $element.ElementID) ($($element.DataSize) bytes)" $segment = $element $segmentDataOffset = $offset + $element.ElementID.Length $tracks = @() $fileData = $null $contentOffset = 0 while ($contentOffset -lt $segment.DataSize) { try { $currentOffset = $segmentDataOffset + $contentOffset if ($currentOffset + 2 -gt $bytes.Length) { break } $elem = Get-EbmlElementFromBuffer -Buffer $bytes -Offset $currentOffset $elemIdHex = ConvertTo-ByteString -Bytes $elem.ElementID Write-Verbose " Element at +${contentOffset}: ${elemIdHex} ($($elem.DataSize) bytes)" if ($elem.ElementID.Length -eq 1 -and $elem.ElementID[0] -eq 0xC1) { Write-Verbose " -> ReSampleFile found" $fileData = ConvertFrom-SrsFileData -Data $elem.ElementData } elseif ($elem.ElementID.Length -eq 1 -and $elem.ElementID[0] -eq 0xC2) { Write-Verbose " -> ReSampleTrack found" $trackData = ConvertFrom-SrsTrackData -Data $elem.ElementData $tracks += $trackData } $contentOffset += $elem.TotalLength } catch { Write-Verbose "Error parsing element at offset $($segmentDataOffset + $contentOffset): $_" break } } return [PSCustomObject]@{ FileMetadata = $fileData Tracks = $tracks RawBytes = $bytes SegmentDataOffset = $segmentDataOffset } } |