我有一个应用程序以子进程的形式运行 ffmpeg/ffprobe(类似于在命令行上运行),然后解析命令输出以检索有关文件的元数据和/或执行文件的转码。并且我的应用需要知道给定文件是否受 DRM 保护。
注意-我已经看过这个问题。它不涉及通过编程解析输出来确定 DRM 保护。它仅涉及人工解析输出。
我已经知道我可以运行 ffprobe,如果我用眼睛扫描输出并在输出的某处看到类似“检测到 DRM 保护...解码可能会失败”的内容,我就知道该文件受到保护。请参阅此示例输出:
ffprobe -hide_banner CelticWoman-OnlyAWomansHeart.wma
[asf @ 0x7f9bab000000] DRM protected stream detected, decoding will likely fail!
Input #0, asf, from 'CelticWoman-OnlyAWomansHeart.wma':
Metadata:
...
但是,上述输出存在两个问题:
1 - 是的不适用于机器。我必须浏览一大堆输出才能找到几个单词。解析这样的输出效率很低,因为它是供人类使用,而不是供机器使用。
2 - 我不知道上述输出在不同文件类型中是否一致。换句话说,上面的示例输出适用于 ASF 容器中的 WMA 文件。如果这是 FLAC 或 DTS 或其他类型的文件怎么办?使用的措辞是否相同,以便我的应用程序每次都可以解析和检测它?
我需要的是某种输出属性,我的应用程序可以可靠且可预测地解析...一些键值对(例如“drm-protected=true”)在各个媒体文件类型中是一致的
那么,ffprobe/ffmpeg 上的哪些选项可以为我提供机器可解析的键值对,告诉我某个文件是否具有 DRM 保护?
太感谢了 !
答案1
使用如下选项
ffprobe -v quiet -print_format json -show_format -show_streams
这篇文章最初发布在这里https://gist.github.com/nrk/2286511
使用“jq”解析 json 的一个例子是:
ffprobe -v quiet -print_format json -show_format -show_streams songFile.mp3 | jq .streams[0].codec_tag_string
这将返回受 DRM 保护的流的流编解码器或“drms”。请注意,这仅返回使用“jq”选择的第一个流的输出