libdvbtee เป็นตัวแยกวิเคราะห์สตรีมและไลบรารีตัวรวบรวมข้อมูลบริการสำหรับสตรีมการขนส่ง MPEG2 ไลบรารีประกอบด้วยตัวแยกวิเคราะห์ข้อมูลบริการโปรแกรม (PSI) และการสนับสนุนสำหรับวิธีการสตรีมเครือข่ายต่างๆ และตระหนักถึง API เคอร์เนล linux-dvb รวมถึง API การสตรีมเครือข่าย HDHomeRun
ไลบรารีมีฟังก์ชันการทำงานเพียงพอที่จะขับเคลื่อนแอปพลิเคชันมิดเดิลแวร์โทรทัศน์ที่มีคุณสมบัติครบถ้วน รวมถึงความสามารถในการรับและสตรีมข้อมูลผ่าน UDP, TCP, HTTP, DMA และกลไกอื่น ๆ อีกมากมาย
libdvbtee_server
อนุญาตให้ควบคุมคุณสมบัติเหล่านี้จากเซสชัน http หรืออินเทอร์เฟซบรรทัดคำสั่ง และสามารถใช้เพื่อควบคุมจูนเนอร์หลายตัว
libdvbtee_parser
เป็นไลบรารีที่สร้างจากแหล่ง libdvbtee เพื่อใช้งานโดย node-dvbtee libdvbtee_parser
ถูกโฮสต์ภายในพื้นที่เก็บข้อมูลการพัฒนา git เดียวกันกับ libdvbtee
และด้วยเหตุนี้ พวกเขาจึงแชร์ไฟล์ README.md ไฟล์เดียวเดียวกันนี้
แอปพลิเคชันปฏิบัติการ dvbtee มีคุณสมบัติที่หลากหลาย รวมถึง: การสแกน, การปรับแต่ง, การเรียกดู EPG, รับสตรีมเครือข่ายขาเข้า, สตรีมสตรีมเครือข่ายออก, จัดการจูนเนอร์หลายตัว และอื่นๆ...
สามารถเข้าถึงเซิร์ฟเวอร์ได้ทาง telnet หรือ http หมายเลขพอร์ตเริ่มต้นคือ 64080
แต่สามารถกำหนดค่าได้ server_example
ใช้หมายเลขพอร์ต 62080
เมื่อเข้าถึงเซิร์ฟเวอร์ผ่าน http ให้นำหน้าคำสั่งด้วย / และอาร์กิวเมนต์ด้วย = เมื่อเข้าถึงเซิร์ฟเวอร์ผ่าน telnet ให้ป้อนในรูปแบบ 'command=argument' แล้วกด Enter
ไมเคิล ไอรา ครัฟกี้
mkrufky ที่ linuxtv dot org
วิธีที่แนะนำในการสร้าง libdvbtee คือโดยใช้สคริปต์ build-auto.sh
:
./build-auto.sh
dvbtee/dvbtee < mpegfile.ts
libdvbtee เดิมได้รับการพัฒนาโดยใช้ระบบ qmake build เพื่อรองรับการสร้างหลายแพลตฟอร์มอย่างง่ายดาย libdvbtee ยังคงรองรับระบบ qmake แต่ตอนนี้ใช้ autotools เป็นระบบ build ที่ต้องการด้วยเหตุผลหลายประการ
autoreconf --install
./configure
make
dvbtee/dvbtee < mpegfile.ts
หากคุณต้องการสร้าง libdvbtee โดยใช้ตัวถอดรหัสตาราง / descriptor เวอร์ชันเก่า ด้วยเหตุผลแปลก ๆ บางอย่าง ให้ระบุ --enable-olddecoder เพื่อกำหนดค่า
autoreconf --install
./configure --enable-olddecoder
make
dvbtee/dvbtee < mpegfile.ts
หากคุณต้องการใช้ qmake มากกว่า autotools ให้ใช้คำสั่งต่อไปนี้:
qmake -r
make
LD_LIBRARY_PATH=libdvbtee:libdvbtee_server dvbtee/dvbtee < mpegfile.ts
หากคุณต้องการสร้าง libdvbtee โดยใช้เวอร์ชันเก่าของตัวถอดรหัสตาราง / descriptor ด้วยเหตุผลแปลก ๆ บางประการ ให้ระบุ CONFIG+=olddecoder เป็น qmake
qmake -r CONFIG+=olddecoder
make
LD_LIBRARY_PATH=libdvbtee:libdvbtee_server dvbtee/dvbtee < mpegfile.ts
libdvbtee ขึ้นอยู่กับ libdvbpsi สำหรับการแยกวิเคราะห์ PSIP แม้ว่า libdvbtee จะสร้างต่อจาก libdvbpsi เวอร์ชันเก่า แต่จำเป็นต้องมีเวอร์ชันที่ใหม่กว่าเพื่อมอบฟีเจอร์ล่าสุดของ libdvbtee เช่น การรองรับ ATSC
ระบบบิลด์ของ libdvbtee สามารถสร้างและเชื่อมโยงกับ libdvbpsi เวอร์ชันล่าสุดได้โดยการวางสำเนาของที่เก็บ libdvbpsi ไว้ที่ระดับบนสุดของแผนผังต้นทางของ libdvbtee
แทนที่จะให้คำแนะนำทีละขั้นตอนใน README นี้ เชลล์สคริปต์ถูกจัดเตรียมไว้ซึ่งจะดึงข้อมูลแหล่งที่มา libdvbpsi ล่าสุด กำหนดค่าระบบบิลด์ และสร้างไลบรารีทั้งสองร่วมกัน
สำหรับบิลด์รวมของ libdvbtee พร้อมกับ libdvbpsi เวอร์ชันล่าสุดโดยใช้ autotools (แนะนำ):
./build-auto.sh
dvbtee/dvbtee < mpegfile.ts
สำหรับบิลด์รวมของ libdvbtee พร้อมกับ libdvbpsi เวอร์ชันล่าสุดโดยใช้ qmake:
./build-qmake.sh
LD_LIBRARY_PATH=libdvbtee:libdvbtee_server dvbtee/dvbtee < mpegfile.ts
-a adapter id
-A (1 for ATSC, 2 for ClearQAM)
-b display bitrates & statistics
-c channel to tune /
comma (,) separated list of channels to scan /
scan minimum channel
-C channel to tune /
comma (,) separated list of channels to scan /
scan maximum channel
-f frontend id
-F filename to use as input
-t timeout
-T number of tuners (dvb adapters) allowed to use, 0 for all
-s scan, optional arg when using multiple tuners:
1 for speed, 2 for redundancy,
3 for speed AND redundancy,
4 for optimized speed / partial redundancy
-S server mode, optional arg 1 for command server,
2 for http stream server, 3 for both
-i pull local/remote tcp/udp port for data
-n bind to a specific network interface
-I request a service and its associated PES streams by its service id
-E enable EPG scan, optional arg to limit the number of EITs to parse
-e enable ETT extended text tables (EPG descriptions, ATSC only)
-o output filtered data, optional arg is a filename / URI, ie udp://127.0.0.1:1234
-O output options: (or-able) 1 = PAT/PMT, 2 = PES, 4 = PSIP, 8 = AUDIO, 16 = VIDEO
-H use a HdHomeRun device, optional arg to specify the device string
-j enable json output of decoded tables & descriptors
-d debug level
-q quiet most logging
-h display additional help
หากต้องการปรับแต่งบริการ id 1 ของฟิสิคัลแชนเนล 33 และสตรีมไปยังพอร์ต udp:
dvbtee -c33 -I1 -oudp://192.168.1.100:1234
หากต้องการปรับแต่งส่วนหน้าที่สองของอะแดปเตอร์ 1 และสตรีม TS ทั้งหมดของฟิสิคัลแชนเนล 44 ไปยังผู้ฟัง TCP:
dvbtee -c44 -otcp://192.168.1.200:5555
หากต้องการฟังพอร์ต TCP และสตรีมไปยังพอร์ต UDP:
dvbtee -itcp://5555 -oudp://192.168.1.100:1234
หากต้องการแยกวิเคราะห์ไฟล์ที่บันทึกไว้และกรองข้อมูล PSIP โดยบันทึกสตรีม PAT/PMT และ PES ลงในไฟล์:
dvbtee -Finput.ts -O3 -ofile://output.ts
หากต้องการแยกสตรีม UDP เป็นเวลาสิบวินาที:
dvbtee -iudp://127.0.0.1:1234 -t10
หากต้องการสแกนหาบริการโดยใช้เครื่องรับสัญญาณที่เชื่อมต่อเครื่องแรก:
dvbtee -s -a0
หากต้องการสแกนหาบริการ ClearQAM โดยใช้จูนเนอร์ 5 ตัวที่ปรับให้เหมาะกับความเร็วและความซ้ำซ้อนบางส่วน:
dvbtee -A2 -T5 -s4
หากต้องการสแกนหาบริการ ATSC โดยใช้เครื่องรับ HDHomeRun 2 เครื่องที่ปรับให้เหมาะกับความเร็วและความซ้ำซ้อน:
dvbtee -A1 -H -T2 -s3
ในการสตาร์ทเซิร์ฟเวอร์โดยใช้อะแด็ปเตอร์ 0:
dvbtee -a0 -S
หากต้องการเริ่มต้นเซิร์ฟเวอร์โดยใช้ tuner1 ของอุปกรณ์ HdHomeRun เฉพาะ (เช่น ABCDABCD):
dvbtee -H ABCDABCD-1 -S
หากต้องการสแกนช่องที่เปิดใช้งานเอาต์พุต JSON ให้ใช้คำสั่งต่อไปนี้:
dvbtee -s -c13 -j
...ควรสร้างผลลัพธ์ที่คล้ายกับตัวอย่างต่อไปนี้:
scan channel 13...
store PAT: v0, ts_id: 2011
3 | 30
4 | 40
5 | 50
store PMT: v12, service_id 3, pcr_pid 49
es_pid | type
31 | 0x02 (Video MPEG-2) |
34 | 0x81 (Audio AC3 (ATSC)) | eng
35 | 0x81 (Audio AC3 (ATSC)) | spa
36 | 0x81 (Audio AC3 (ATSC)) | fre
store VCT: v6, ts_id 2011, b_cable_vct 0
channel | service_id | source_id | service_name
13.1 | 3 | 1 | WNET-HD | eng, spa, fre
13.2 | 4 | 2 | KIDS | eng, spa, fre
13.3 | 5 | 3 | V-Me | eng
store MGT: v6
table type | pid | ver | bytes
0x0000 | 0x1ffb | 6 | 187
0x0100 | 0x1d00 | 6 | 1103
0x0101 | 0x1d01 | 6 | 1105
0x0102 | 0x1d02 | 6 | 1132
0x0103 | 0x1d03 | 6 | 1305
0x0200 | 0x1e00 | 6 | 1197
0x0201 | 0x1e01 | 6 | 1220
0x0202 | 0x1e02 | 6 | 1157
0x0203 | 0x1e03 | 6 | 1213
store PMT: v12, service_id 5, pcr_pid 81
es_pid | type
51 | 0x02 (Video MPEG-2) |
54 | 0x81 (Audio AC3 (ATSC)) | eng
store PMT: v12, service_id 4, pcr_pid 65
es_pid | type
41 | 0x02 (Video MPEG-2) |
44 | 0x81 (Audio AC3 (ATSC)) | eng
45 | 0x81 (Audio AC3 (ATSC)) | spa
46 | 0x81 (Audio AC3 (ATSC)) | fre
# channel 13, 213000000,
13.1-WNET-HD:213000000:8VSB:49:52:3
13.2-KIDS:213000000:8VSB:65:68:4
13.3-V-Me:213000000:8VSB:81:84:5
found 3 services
TSID#07db: [ { "programs": [ { "number": 3, "pid": 48 }, { "number": 4, "pid": 64 }, { "number": 5, "pid": 80 } ], "tableId": 0, "tableName": "PAT", "tsId": 2011, "version": 0 }, { "pcrPid": 49, "program": 3, "streams": [ { "pid": 49, "streamType": 2, "streamTypeString": "Video MPEG-2" }, { "descriptors": [ { "bitRateCode": 14, "bsid": 8, "bsmod": 0, "description": "", "descriptorTag": 129, "fullSvc": true, "language": "eng", "numChannels": "2/0", "sampleRate": "48", "surroundMode": "Not indicated" }, { "ISO639Lang": [ { "audioType": 0, "language": "eng" } ], "descriptorTag": 10 } ], "pid": 52, "streamType": 129, "streamTypeString": "Audio AC3 (ATSC)" }, { "descriptors": [ { "bitRateCode": 8, "bsid": 8, "bsmod": 0, "description": "", "descriptorTag": 129, "fullSvc": true, "language": "spa", "numChannels": "2/0", "sampleRate": "48", "surroundMode": "Not indicated" }, { "ISO639Lang": [ { "audioType": 0, "language": "spa" } ], "descriptorTag": 10 } ], "pid": 53, "streamType": 129, "streamTypeString": "Audio AC3 (ATSC)" }, { "descriptors": [ { "bitRateCode": 8, "bsid": 8, "bsmod": 2, "description": "", "descriptorTag": 129, "fullSvc": true, "language": "fre", "numChannels": "2/0", "sampleRate": "48", "surroundMode": "Not indicated" }, { "ISO639Lang": [ { "audioType": 0, "language": "fre" } ], "descriptorTag": 10 } ], "pid": 54, "streamType": 129, "streamTypeString": "Audio AC3 (ATSC)" } ], "tableId": 2, "tableName": "PMT", "version": 12 }, { "channels": [ { "accessControlled": false, "carrierFreq": 0, "descriptors": [ { "descriptorTag": 161, "serviceLocation": [ { "esPid": 49, "streamType": 2, "streamTypeString": "Video MPEG-2" }, { "esPid": 52, "lang": "eng", "streamType": 129, "streamTypeString": "Audio AC3 (ATSC)" }, { "esPid": 53, "lang": "spa", "streamType": 129, "streamTypeString": "Audio AC3 (ATSC)" }, { "esPid": 54, "lang": "fre", "streamType": 129, "streamTypeString": "Audio AC3 (ATSC)" } ] } ], "etmLocation": 0, "hidden": false, "hideGuide": false, "major": 13, "minor": 1, "modulation": 4, "outOfBand": true, "pathSelect": true, "program": 3, "serviceName": "WNET-HD", "serviceType": 2, "sourceId": 1, "tsId": 2011 }, { "accessControlled": false, "carrierFreq": 0, "descriptors": [ { "descriptorTag": 161, "serviceLocation": [ { "esPid": 65, "streamType": 2, "streamTypeString": "Video MPEG-2" }, { "esPid": 68, "lang": "eng", "streamType": 129, "streamTypeString": "Audio AC3 (ATSC)" }, { "esPid": 69, "lang": "spa", "streamType": 129, "streamTypeString": "Audio AC3 (ATSC)" }, { "esPid": 70, "lang": "fre", "streamType": 129, "streamTypeString": "Audio AC3 (ATSC)" } ] } ], "etmLocation": 0, "hidden": false, "hideGuide": false, "major": 13, "minor": 2, "modulation": 4, "outOfBand": true, "pathSelect": true, "program": 4, "serviceName": "KIDS", "serviceType": 2, "sourceId": 2, "tsId": 2011 }, { "accessControlled": false, "carrierFreq": 0, "descriptors": [ { "descriptorTag": 161, "serviceLocation": [ { "esPid": 81, "streamType": 2, "streamTypeString": "Video MPEG-2" }, { "esPid": 84, "lang": "eng", "streamType": 129, "streamTypeString": "Audio AC3 (ATSC)" } ] } ], "etmLocation": 0, "hidden": false, "hideGuide": false, "major": 13, "minor": 3, "modulation": 4, "outOfBand": true, "pathSelect": true, "program": 5, "serviceName": "V-Me", "serviceType": 2, "sourceId": 3, "tsId": 2011 } ], "isCableVCT": false, "tableId": 200, "tableName": "VCT", "tsId": 2011, "version": 6 }, { "tableId": 199, "tableName": "MGT", "tables": [ { "bytes": 187, "pid": 8187, "type": 0, "version": 6 }, { "bytes": 1103, "pid": 7424, "type": 256, "version": 6 }, { "bytes": 1105, "pid": 7425, "type": 257, "version": 6 }, { "bytes": 1132, "pid": 7426, "type": 258, "version": 6 }, { "bytes": 1305, "pid": 7427, "type": 259, "version": 6 }, { "bytes": 1197, "pid": 7680, "type": 512, "version": 6 }, { "bytes": 1220, "pid": 7681, "type": 513, "version": 6 }, { "bytes": 1157, "pid": 7682, "type": 514, "version": 6 }, { "bytes": 1213, "pid": 7683, "type": 515, "version": 6 } ], "version": 6 }, { "pcrPid": 81, "program": 5, "streams": [ { "descriptors": [ { "CaptionService": [ { "digital_cc": "708", "easyReader": false, "iso639lang": "eng", "line21field": true, "serviceNumber": 1, "wideAspectRatio": false } ], "descriptorTag": 134 } ], "pid": 81, "streamType": 2, "streamTypeString": "Video MPEG-2" }, { "descriptors": [ { "bitRateCode": 10, "bsid": 8, "bsmod": 0, "description": "", "descriptorTag": 129, "fullSvc": true, "language": "eng", "numChannels": "2/0", "sampleRate": "48", "surroundMode": "Not indicated" }, { "ISO639Lang": [ { "audioType": 0, "language": "eng" } ], "descriptorTag": 10 } ], "pid": 84, "streamType": 129, "streamTypeString": "Audio AC3 (ATSC)" } ], "tableId": 2, "tableName": "PMT", "version": 12 }, { "pcrPid": 65, "program": 4, "streams": [ { "descriptors": [ { "CaptionService": [ { "digital_cc": "708", "easyReader": false, "iso639lang": "eng", "line21field": true, "serviceNumber": 1, "wideAspectRatio": false } ], "descriptorTag": 134 } ], "pid": 65, "streamType": 2, "streamTypeString": "Video MPEG-2" }, { "descriptors": [ { "bitRateCode": 14, "bsid": 8, "bsmod": 0, "description": "", "descriptorTag": 129, "fullSvc": true, "language": "eng", "numChannels": "2/0", "sampleRate": "48", "surroundMode": "Not indicated" }, { "ISO639Lang": [ { "audioType": 0, "language": "eng" } ], "descriptorTag": 10 } ], "pid": 68, "streamType": 129, "streamTypeString": "Audio AC3 (ATSC)" }, { "descriptors": [ { "bitRateCode": 8, "bsid": 8, "bsmod": 0, "description": "", "descriptorTag": 129, "fullSvc": true, "language": "spa", "numChannels": "2/0", "sampleRate": "48", "surroundMode": "Not indicated" }, { "ISO639Lang": [ { "audioType": 0, "language": "spa" } ], "descriptorTag": 10 } ], "pid": 69, "streamType": 129, "streamTypeString": "Audio AC3 (ATSC)" }, { "descriptors": [ { "bitRateCode": 8, "bsid": 8, "bsmod": 2, "description": "", "descriptorTag": 129, "fullSvc": true, "language": "fre", "numChannels": "2/0", "sampleRate": "48", "surroundMode": "Not indicated" }, { "ISO639Lang": [ { "audioType": 0, "language": "fre" } ], "descriptorTag": 10 } ], "pid": 70, "streamType": 129, "streamTypeString": "Audio AC3 (ATSC)" } ], "tableId": 2, "tableName": "PMT", "version": 12 } ]
tuner specify tuner id
feeder specify feeder id
scan scan for services, optional arg comma (,) separated list of channels to scan
scanepg same as 'scan' with EPG data collection enabled during scan
startscan same as 'scan' but asynchronous
startscanepg combo of 'scanepg' and 'startscan'
tune tune to a channel or service, ie:
tune=33 (full mux) / tune=44~3 (svc id 3)
channels list channels
channel tune physical channel (unsafe - use tune instead)
service select service (unsafe - use tune instead)
stream add output file / tcp / udp / http stream, ie:
stream=udp:192.168.1.100:1234
stream=tcp:192.168.1.200:5555
stream=file:output.ts
stream (over http with no arg will begin streaming to current socket)
epg dump collected EPG data
xmltv dump collected EPG data in XMLTV format
stop stop the tuner
stopoutput stop the tuner and output
check display debug info if debug is enabled
debug enable debug
parser enable / disable the parser for data shovel
listen listen for TS on a TCP or UDP port
save save scanned channels
quit stop the server and exit