我已经通过 TSP 命令捕获了传输流
命令:tsp -I ip port --source ip -O file stream_capture1.ts
然后使用 ffprobe,下面是捕获正确流的输出
Input #0, mpegts, from 'stream_capture1.ts':
Duration: 20:56:00.19, start: 21971.910678, bitrate: 5 kb/s
Program 1
Metadata:
service_name : CS11G
service_provider: ABC
Stream #0:1[0x70]: Video: hevc (Rext) ([36][0][0][0] / 0x0024), yuv422p10le(tv, progressive), 1920x540 [SAR 1:2 DAR 16:9], 59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc
Stream #0:2[0x71]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, 5.1, fltp, 379 kb/s
Stream #0:3[0x72]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 143 kb/s
Stream #0:4[0x73]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, s16p, 128 kb/s
Stream #0:5[0x75]: Data: bin_data ([6][0][0][0] / 0x0006)
Stream #0:6[0x76]: Data: bin_data (VANC / 0x434E4156)
Program 2
Metadata:
service_name : CS11H
service_provider: ABC
Stream #0:7[0x7a]: Video: hevc (Rext) ([36][0][0][0] / 0x0024), yuv422p10le(tv, progressive), 1920x540 [SAR 1:2 DAR 16:9], 59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc
Stream #0:8[0x7b]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, 5.1, fltp, 383 kb/s
Stream #0:9[0x7c]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 134 kb/s
Stream #0:10[0x7d]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, s16p, 128 kb/s
Stream #0:11[0x7f]: Data: bin_data ([6][0][0][0] / 0x0006)
Stream #0:12[0x80]: Data: bin_data (VANC / 0x434E4156)
但是当我尝试使用 ffmpeg 捕获相同的传输流时
命令:ffmpeg -i "udp://ip:port?localaddr=ip&sources=ip&overrun_nonfatal=1&buffer_size=4000000&fifo_size=1000000" -c copy -map 0 -vsync passthrough -copyts vanc_stream_ffmpeg.ts
并运行下面 ffprobe 的输出:
Input #0, mpegts, from 'vanc_stream_ffmpeg.ts':
Duration: N/A, start: 44077.203733, bitrate: N/A
Program 1
Metadata:
service_name : Service01
service_provider: FFmpeg
Stream #0:0[0x100]: Video: hevc (Rext) (HEVC / 0x43564548), yuv422p10le(tv, progressive), 1920x540 [SAR 1:2 DAR 16:9], 59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc
Stream #0:1[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, 5.1, fltp, 384 kb/s
Stream #0:2[0x102]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 127 kb/s
Stream #0:3[0x103]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 128 kb/s
Stream #0:4[0x104]: Data: bin_data ([6][0][0][0] / 0x0006)
Stream #0:5[0x105]: Data: bin_data ([6][0][0][0] / 0x0006)
Stream #0:6[0x106]: Video: hevc (Rext) (HEVC / 0x43564548), yuv422p10le(tv, progressive), 1920x540 [SAR 1:2 DAR 16:9], 59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc
Stream #0:7[0x107]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, 5.1, fltp, 384 kb/s
Stream #0:8[0x108]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 127 kb/s
Stream #0:9[0x109]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 128 kb/s
Stream #0:10[0x10a]: Data: bin_data ([6][0][0][0] / 0x0006)
Stream #0:11[0x10b]: Data: bin_data ([6][0][0][0] / 0x0006)
现在,上述输出的问题是,它只改变了数据流,没有正确捕获 VANC 数据/数据包,并且只从数据包中删除了 PTS/DTS 值
**视频、音频数据包正确
以下是我使用 ffprobe 命令检查数据包时的输出:ffprobe -select_streams i:261 -show_packets -show_data vanc_stream_ffmpeg.ts
[PACKET]
codec_type=data
stream_index=5
pts=N/A
pts_time=N/A
dts=N/A
dts_time=N/A
duration=N/A
duration_time=N/A
convergence_duration=N/A
convergence_duration_time=N/A
size=124
pos=82714924
flags=K_
[SIDE_DATA]
side_data_type=MPEGTS Stream ID
[/SIDE_DATA]
data=
00000000: 0002 4001 6140 552a 5a9 544 f5d bf9a [email protected]@U*ZiT...
00000010: a727 d2fc 651a b75 77d 2fa8 000 bea0 .'..e...s}/...
00000020: 0802 fa80 20b ea00 82f a02 00be a008 .... ..../....
00000030: 02fa 820 0bea 0080 2fa8 000 ba0 0802 ... ..../.....
[/PACKET]
我尝试了各种标志来正确检索数据包而不改变 PTS/DTS
我使用过的标志:
- -c:d 复制
- -复制
- -fix_teletext_pts 1
- -dts_delta_threshold 阈值
需要解决方案,以便 ffmpeg 命令将从流中获取数据包,就像 Tsp 命令获取一样,或者需要任何与复制数据包相关的标志而不丢弃 PTS/DTS 值。
答案1
如果您想将输入捕获为原始字节流,那么您需要强制使用数据格式,否则 ffmpeg 将尝试解释所有流并用通用占位符值替换无法识别的流。
ffmpeg -f data -i "udp://ip:port?localaddr=ip&sources=ip&overrun_nonfatal=1&buffer_size=4000000&fifo_size=1000000" -c copy -map 0 -f data vanc_stream_ffmpeg.ts