ffmpeg 错误地获取数据包的 PTS/DTS

ffmpeg 错误地获取数据包的 PTS/DTS

我已经通过 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

我使用过的标志:

  1. -c:d 复制
  2. -复制
  3. -fix_teletext_pts 1
  4. -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

相关内容