# TSReader
**Repository Path**: xsdf1985/TSReader
## Basic Information
- **Project Name**: TSReader
- **Description**: TS流分析工具
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-05-29
- **Last Updated**: 2025-05-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# MPEG Transport Stream reader
I've attended recently C\+\+Now 2021, which has been held online for the last two years.
Some of the sponsors of this event used a channel in the Discord server to post different job offers and one of them, Unified Streaming, suggested to write the program below before applying for a position.
Although I'm not looking for a job at the moment, I thought it would be a good way of doing some programming using modern C\+\+.
## Description
Could you write a program that takes a [TS file](http://en.wikipedia.org/wiki/MPEG_transport_stream) and writes the audio and video as two separate files to disk (raw AAC and raw AVC1)?
The code should use:
- standard C\+\+17.
- using only .hpp/.cpp and a Makefile.
- no platform specifics (like MFC/COM/ATL).
- the raw streams should be viewable/playable with for instance FFplay, as verification/test.
- example input: http://test.unified-streaming.com/elephants.ts
- We also would like to mention to not use ffmpeg/avconv or something other from say Github: we would like to see your work.
- We would like to suggest to do this as a Github project and write up your design/docs in the README.md Github provides.
## Design
- Command line parsing errors print the usage in standard output and exit.
- Runtime errors such as parsing errors print the error message in standard output and exit.
- `main` parses the command line, creates a `FileReader` to read the TS file, and proceeds to read it.
- `FileReader` opens the TS file and, for each TS packet:
- reads it into a `PacketBuffer`,
- asks `PacketParser` to parse it,
- asks `PacketProcessor` to do some processing on the parsed packet, and, finally,
- performs some post processing: e.g. collect stats or write some streams out to file.
- `PacketParser` parses the TS packet header and, if present, the adaptation field and payload data.
In order to do that, it reads byte chunks from `PacketBuffer`.
It also does some error checking: stuffing bytes, reserved and unused bits, CRC32...
- `PacketBuffer` lets byte chunks to be read in big-endian, which is needed for all the TS headers.
- `PacketProcessor` basically:
- builds the PSI tables (PAT and PMT) for packets containing PSI information, and
- saves the PES data for packets containing PES payloads.
## Implementation
- `Packet`, `Header`, `AdaptationField`, `AdaptationExtension` and so on are structs.
- Field masks and byte chunks are `boost::dynamic_bitset`s. This way we can easily perform binary operations.
## Requirements
- CMake 3.20.4.
- Boost libraries 1.75.0.
- Boost program_options static multithreaded library (libboost_program_options-vcXXX-mt-[gd-][x32|x64]-1_75.lib)
## Compilation
### Visual Studio (Windows)
- Open `ts_reader.sln` with Visual Studio.
- Right click on the `ts_reader` project, and go to `Properties`.
- Update the Boost root path in `Configuration Properties > C/C++ > General > Additional Include Directories` to point to your Boost root path.
- Update the Boost library folder in `Configuration Properties > Linker > General > Additional Library Directories`.
- Save these changes and exit the project properties.
- Right click on the `ts_reader` solution, and `Build Solution`.
### CMake (Windows/Linux)
- Open `CMakeLists.txt` and edit `BOOST_ROOT` and `BOOST_LIBRARY_DIR` variables to point to your Boost root and Boost library folders, respectively.
- From a shell, go to the project folder, and execute:
```
~/projects/ts_reader> cmake -S . -B build
~/projects/ts_reader> cmake --build build
```
## Usage
`ts_reader [-e|--extract ] [-s|--stats]`, where:
- `` is the path to the TS file. It can be absolute or relative to the `ts_reader.exe` location, and
- `` is a comma separated list of stream types.
It supports hexadecimal, decimal or octal notation (e.g. 0xf, 15 or 017 for audio).
As an example, you can try with the provided sample:
```
~/projects/ts_reader/build> ./ts_reader ../samples/elephants.ts -e 0xf,0x1b
~/projects/ts_reader/build> ./ts_reader ../samples/elephants.ts --stats
```