MTL(Media Transport Library)은 미디어 데이터의 높은 처리량, 낮은 대기 시간 전송 및 수신을 위해 설계된 소프트웨어 기반 솔루션입니다. 미디어 전송을 위해 특별히 제작된 효율적인 사용자 공간 LibOS UDP 스택이 특징이며 관리형 IP 네트워크를 통한 전문 미디어를 위한 SMPTE ST 2110 호환 구현이 내장되어 있습니다.
미디어 전송 라이브러리는 소프트웨어 라이브러리와 IP 네트워크를 통해 ST2110 호환 미디어 스트림을 전송하는 데 따른 엄격한 타이밍 문제를 해결합니다. 특수 하드웨어 대신 이 라이브러리는 SMPTE ST 2110 표준의 엄격한 타이밍 문제를 충족하기 위해 속도 제한을 통합하는 기존 NIC와 함께 기존에 일반적으로 사용 가능한 CPU 플랫폼을 활용합니다.
우리 프로젝트에서 가치를 발견했다면 별표를 주는 것을 고려해 보세요. 귀하의 지원은 우리가 성장하고 오픈 소스 커뮤니티에서 더 많은 사람들에게 다가가는 데 도움이 됩니다. 모든 별은 중요하며 매우 감사합니다.
지원되는 데이터 경로 백엔드: DPDK PMD, 기본 커널 소켓 및 eBPF 필터가 있는 AF_XDP.
사용자 공간 LibOS UDP 스택은 POSIX 소켓 호환 API를 갖추고 있습니다.
루트가 아닌 실행.
다중 프로세스 처리로 프로세스당 최대 8개의 NIC를 허용합니다.
SR-IOV의 가상화 지원.
하드웨어 타임스탬프 오프로드 기능이 내장된 PTP 프로토콜입니다.
FFMPEG 플러그인, OBS(Open Broadcaster Software) 플러그인 및 Intel® Media SDK 지원.
네이티브 C/C++ API 외에도 Python 및 Rust에 대한 바인딩도 제공합니다.
좁고 넓은 간격. 당사 소프트웨어 솔루션에 대한 ST2110 좁은 보고서는 규정 준수 페이지를 참조하십시오.
ST2110-10, ST2110-20, ST2110-21, ST2110-30, ST2110-40, ST2022-7.
1080p, 1080i, 720p, 4k, 8k 및 기타.
FPS: 120, 119.88, 100, 60, 59.94, 50, 30, 29.97, 25, 24, 23.98.
YUV 4:2:2 10비트 및 기타를 포함하여 ST2110-20에 나열된 모든 비디오 형식이 지원됩니다.
빅엔디안과 리틀엔디안 사이의 SIMD 색 공간 변환기.
인코더/디코더 플러그인 인터페이스를 갖춘 ST2110-22.
RTP 패스스루 인터페이스를 통한 ST2022-6.
하드웨어 RX 타임스탬프 오프로드 기능을 갖춘 ST2110-20 RX 타이밍 규정 준수 파서.
미디어 전송 라이브러리는 DPDK(Data Plane Development Kit) EAL(메모리 및 코어 관리를 포함한 환경 추상화 계층)을 활용하여 매우 효율적이고 실시간이며 지연 시간이 짧은 미디어 전송 솔루션을 구현합니다. 이 소프트웨어 기반 미디어 전송 스택을 사용하면 COTS 하드웨어를 사용하여 엣지 및 클라우드 환경에 배포할 수 있습니다.
라이브러리에는 다양한 NIC 구현을 추상화하고 상위 네트워크 계층에 통합 패킷 TX/RX 인터페이스를 제공하도록 설계된 가상 데이터 경로 백엔드 계층이 통합되어 있습니다. 현재 세 가지 유형의 NIC 장치를 지원합니다.
DPDK 폴 모드 드라이버(PMD): 이 드라이버는 '폴 모드' 드라이버를 활용하여 커널의 네트워킹 스택을 완전히 우회합니다. 이 접근 방식은 직접적인 하드웨어 액세스를 제공하고 과도한 사용자/커널 컨텍스트 전환을 제거하며 IRQ(인터럽트 요청) 스위치를 방지합니다. 결과적으로 DPDK PMD는 매우 낮은 대기 시간과 높은 처리량을 제공하므로 까다로운 네트워킹 애플리케이션에 이상적입니다.
기본 Linux 커널 네트워크 소켓 스택: 이 옵션은 전체 범위의 커널 생태계를 지원합니다.
eBPF 필터가 포함된 AF_XDP: AF_XDP는 Linux 네트워킹 스택의 상당한 발전을 나타내며 원시 성능과 커널 네트워킹 생태계와의 통합 간의 균형을 유지합니다. 이는 성능이 중요한 시나리오에서 특히 유용하지만 DPDK와 같은 전체 커널 우회 솔루션은 실현 가능하지 않거나 바람직하지 않습니다.
라이브러리는 CPU 리소스 활용도를 최적화하는 태스크릿 기반 비동기 스케줄러를 도입하여 다양한 패킷 처리 장치 및 가속기와의 통합을 촉진합니다.
또한 패킷 페이싱 모듈은 부분적으로 하드웨어 오프로드되는 RL(Rate Limit)과 완전한 소프트웨어 기반인 TSC(Timestamp Counter)를 포함하여 다양한 페이싱 알고리즘을 지원합니다.
MTL은 또한 빅엔디안과 리틀엔디안의 CSC(Color Space Format Conversion)를 위한 SIMD(Single Instruction, Multiple Data), DMA(Direct Memory Access) 및 플러그인 인터페이스를 통합하여 종합적인 영상 제작 생태계 구축을 가능하게 합니다.
상세설계는 설계가이드를 참조하시기 바랍니다.
MTL은 DPDK PMD, 커널 소켓 및 AF_XDP 백엔드와의 호환성 덕분에 다양한 이더넷 지원을 제공합니다.
DPDK PMD 지원의 경우 DPDK PMD 사이트(https://doc.dpdk.org/guides/nics/)에서 지원되는 이더넷 하드웨어의 전체 목록을 참조할 수 있습니다.
NIC가 DPDK에서 지원되지 않는 경우 MTL은 커널(Linux) 소켓 전송 지원과 함께 대체 옵션을 제공합니다.
그러나 당사의 일일 개발 및 검증은 주로 Intel E810 시리즈 및 AWS ENA에서 수행되므로 다른 네트워크 인터페이스 카드(NIC)의 상태를 보장할 수 없습니다.
주목해야 할 중요한 점은 TX의 좁은 속도는 속도 제한 기능으로 인해 DPDK PMD와 함께 Intel E810 시리즈에서만 지원된다는 것입니다. 다른 모든 유형의 사용에서는 TSC(Timestamp Counter)를 페이싱 소스로 사용해야 하며 이는 광범위하고 넓은 페이싱만 보장할 수 있습니다.
DPDK, 라이브러리 및 샘플 애플리케이션을 빌드하는 방법에 대한 지침은 빌드 가이드를 참조하세요.
Windows의 경우 빌드 방법에 대한 지침은 Win 빌드 가이드를 참조하세요.
DPDK PMD 백엔드를 기반으로 데모 파이프라인 애플리케이션을 설정하고 실행하는 방법에 대한 지침은 실행 가이드를 참조하세요.
Windows의 경우 Windows 실행 가이드를 참조하세요.
또한 VF 통과를 기반으로 Linux 및 Windows 게스트 VM을 설정하는 방법에 대한 지침은 VM 가이드 및 Windows VM 가이드를 참조하세요.
AWS(클라우드 환경)의 경우 데모 설정 및 실행 방법에 대한 지침은 AWS 실행 가이드를 참조하세요.
커널 NIC 드라이버가 내장된 커널 네트워크 스택에서 이 라이브러리를 실행하려면 커널 소켓 가이드에 제공된 지침을 따르십시오.
Media Transport Library를 기반으로 애플리케이션을 빠르게 개발하려면 디자인 가이드의 ## 6. ST2110 API
를 참조하세요.
MTL은 현재 프로세스 컨텍스트 내에서 직접 작동하는 LD 사전 로드 POSIX 호환 사용자 공간 UDP 스택을 지원합니다. 이 향상된 기능은 일반적으로 다른 사용자 공간 UDP 스택에 사용되는 클라이언트 서비스 아키텍처와 관련된 크로스 코어 메시지 비용을 제거하여 성능을 크게 향상시킵니다. MTL의 스택을 사용하면 NIC 전송 및 수신 기능이 sendto/recvfrom API에서 직접 실행될 수 있으므로 코어 간 호출이 필요 없고 UDP 소비자에 대한 데이터 선호도(LLC)가 유지되므로 성능이 최적화됩니다.
LibOS UDP 스택을 사용하는 방법을 알아보려면 udp 문서를 참조하세요.
MHV'23: 상용 기성 하드웨어를 기반으로 한 실시간 미디어 전송 스택. https://dl.acm.org/doi/10.1145/3588444.3591002
백서: 오픈 소스 라이브러리는 IP 네트워크를 통한 실시간 미디어를 가능하게 합니다. https://www.intel.com/content/www/us/en/content-details/786203/open-source-library-enables-real-time-media-over-ip-networks.html
2022 DPDK Userspace Summit: DPDK를 기반으로 하는 실시간 및 대기 시간이 짧은 미디어 전송 스택. https://www.youtube.com/watch?v=fiiOvHezpBs
우리는 Media Transport Library 프로젝트에 대한 커뮤니티의 기여를 환영합니다. 아이디어나 문제가 있으면 GitHub 문제를 사용하거나 끌어오기 요청을 통해 공유해 주세요.
끌어오기 요청을 열기 전에 다음 단계를 따르세요.
이 저장소를 자신의 공간으로 포크하세요.
변경 사항에 대한 새 분기를 만듭니다.
변경하고 커밋합니다.
변경 사항을 포크된 저장소에 푸시합니다.
기본 저장소에 대한 풀 요청을 엽니다.
메인 브랜치를 업스트림에 자동으로 동기화하지 않으려면 Actions
으로 이동하여 Upstream Sync
워크플로를 비활성화하세요.
스타일 확인을 위해 super-linter 작업을 사용합니다.
C/C++ 코딩의 경우 다음 명령을 실행하여 스타일을 빠르게 수정할 수 있습니다.
./format-coding.sh
Python의 경우 black
및 isort
포맷터가 사용됩니다.
sudo pip 설치 블랙 sudo pip 설치 isort sudo pip 설치 pylint
블랙 파이톤/ 파이썬/ python/example/ 찾기 -name "*.py" -exec pylint {} ;
다른 언어의 경우 Docker 컨테이너 내에서 다음 예제 명령을 확인하세요.
# super-linterdocker run -it --rm -v "$PWD":/opt/ --entrypoint /bin/bash github/super-lintercd /opt/# echo "shfmt check"find ./ -type f -name " *.sh" -exec shfmt -w {} +# echo "shell check"find ./ -name "*.sh" -exec shellcheck {} ;# hadolint checkhadolint docker/ubuntu.dockerfile# actionlint checkactionlint# markdownlint checkfind ./ -name "*.md" -exec markdownlint {} -c .markdown-lint.yml ;# find ./ -name "*.md" -exec markdownlint { } --fix -c .markdown-lint.yml ;# textlintfind ./ -name "*.md" -exec textlint {} ;# find ./ -name "*.md" -exec textlint {} --fix ;