python - 如何通过ffmpeg-python获取service_name和程序列表

标签 python ffmpeg dvb ffmpeg-python service-name

我有一个“.ts”文件。它是已录制的 DVBS 信号的基带帧。 它有一些程序和流。 我使用 FFmpeg 来重建流。当我使用 FFmpeg 时,会显示包含 service_name 的上下文。如何导出程序(不是流)和服务名称列表? ffmpeg.exe -i '.\log_dvbs.ts'

Input #0, mpegts, from '.\log_dvbs.ts':
  Duration: 00:01:14.30, start: 13790.701111, bitrate: 37863 kb/s
  Program 301
    Metadata:
      service_name    : IRIB TV1
      service_provider: IRIB
  Stream #0:23[0xbc2]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, top first), 720x576 [SAR 64:45 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
    Side data:
      cpb: bitrate max/min/avg: 15000000/0/0 buffer size: 1835008 vbv_delay: N/A
  Stream #0:25[0xbc3]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, s16p, 192 kb/s
  Program 351
    Metadata:
      service_name    : RADIO IRAN
      service_provider: IRIB
  Stream #0:24[0xdb6]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, s16p, 192 kb/s
  Program 302
    Metadata:
      service_name    : IRIB TV2
      service_provider:
  Stream #0:15[0xbcc]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, top first), 720x576 [SAR 64:45 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
    Side data:
      cpb: bitrate max/min/avg: 15000000/0/0 buffer size: 1835008 vbv_delay: N/A
  Stream #0:16[0xbcd]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, s16p, 192 kb/s
  Program 352
    Metadata:
      service_name    : RADIO PAYAM
      service_provider: IRIB
  Stream #0:1[0xdc0]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 192 kb/s
  Program 303
    Metadata:
      service_name    : IRIB TV3
      service_provider: IRIB
  Stream #0:11[0xbd6]: Video: mpeg2video ([2][0][0][0] / 0x0002), none, 90k tbr, 90k tbn
  Stream #0:12[0xbd7]: Audio: mp3 ([3][0][0][0] / 0x0003), 0 channels
  Stream #0:13[0xbdb]: Subtitle: dvb_teletext ([6][0][0][0] / 0x0006)

我可以使用 ffmpeg-python 来实现吗? FFmpeg 中是否有直接命令来显示这些标签,或者我必须编写代码来分析“cmd JSON 日志”?

最佳答案

与 llogan 的答案等效的 ffmpeg-python 命令是:

p = ffmpeg.probe('input.ts', show_entries='program=program_id:program_tags=service_name')

结果是一个可能包含列表和子词典的字典。

注意:看起来 ffmpeg.probe 返回的信息比我们要求的更多,但我们可以忽略它。


以下是用于获取服务名称的 Python 代码示例(使用 ffmpeg-python):

import ffmpeg

# The following command from is from llogan's answer to this question.  
# ffprobe -v error -show_entries program=program_id:program_tags=service_name -of xml input.ts

# Return a dictionary (The dictionary has 3 entries p['format'], p['programs'] and p['streams']).
p = ffmpeg.probe('input.ts', show_entries='program=program_id:program_tags=service_name')

programs = p['programs']  # Get p['programs']. programs is a list

# Iterate programs.
# program is a dictionary (entries are program['program_id'], program['streams'], program['tags'])
for program in programs:
    tags = program['tags']  # tags is a dictionary (has the entry tags['service_name']).
    service_name = tags['service_name']
    print('program_id ' + str(program['program_id']) + ' has Service Name: ' + service_name)

输出:
program_id 1 的服务名称:Service01

关于python - 如何通过ffmpeg-python获取service_name和程序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69498192/

相关文章:

ffmpeg - 使用 SDP 将 RTP 流式传输到 FFMPEG

python - 处理除一个异常外的所有异常

python - 按顺序打印列表

python - 花式索引中的多个条件

Python,pandas 根据停止条件找到每一行的长度

linux - gcc 错误 - "error adding symbols: DSO missing from command line"

video - FFmpeg 的 AAC ("libfaac") 编解码器选项?

linux - 如何在系统中显示有关 DVB(数字视频广播)卡的信息

java - 将 VLCJ 用于 DVB-T 调谐器

c++ - DVB PSI解码