FFmpeg 结合cut、ffprobe批量以JSON格式查看音视频信息,附带参数详细说明

背景:查看下面audio_info.txt文件中音频的时长等信息。

bash 复制代码
/data/htdocs/demo/GPT-SoVITS/GPT-SoVITS/output/ambor/slicer_opt/vocal_原音频.wav.reformatted.wav_10.wav_0000000000_0000280800_0.000-4.680.wav|slicer_opt|ZH|所以我们猜测这背后也是深渊教团在捣鬼,没错。
/data/htdocs/demo/GPT-SoVITS/GPT-SoVITS/output/ambor/slicer_opt/vocal_原音频.wav.reformatted.wav_10.wav_0000285600_0000729600_4.760-12.160.wav|slicer_opt|ZH|身为侦察骑士看来今后要想办法多多监视深渊教团的家伙了啊,真是不好意思。
/data/htdocs/demo/GPT-SoVITS/GPT-SoVITS/output/ambor/slicer_opt/vocal_原音频.wav.reformatted.wav_10.wav_0000729600_0001055400_12.160-17.590.wav|slicer_opt|ZH|嗯,你们才刚经历大战归来,我就又说起这些严肃的话题啊,对了。
/data/htdocs/demo/GPT-SoVITS/GPT-SoVITS/output/ambor/slicer_opt/vocal_原音频.wav.reformatted.wav_10.wav_0001055400_0001315800_17.590-21.930.wav|slicer_opt|ZH|我记得之前有过约定,要请你们吃蜜酱、胡萝卜煎肉的。
/data/htdocs/demo/GPT-SoVITS/GPT-SoVITS/output/ambor/slicer_opt/vocal_原音频.wav.reformatted.wav_10.wav_0001315800_0001579200_21.930-26.320.wav|slicer_opt|ZH|可后来一直在忙龙灾的事,不如这次就当做庆功。
/data/htdocs/demo/GPT-SoVITS/GPT-SoVITS/output/ambor/slicer_opt/vocal_原音频.wav.reformatted.wav_10.wav_0001579200_0001821000_26.320-30.350.wav|slicer_opt|ZH|我来请你们吃吧,我也好久没吃蜜酱,胡萝卜煎肉了呢。

cut 命令可以按指定的分隔符分割文本,并提取特定的字段。如果你想要使用 cut 命令按"|"分隔符分割文本,并将分割后的结果作为 ffprobe 命令的参数,你可以使用以下步骤:

  1. 使用 cut 命令按"|"分隔符分割文本,并提取你需要的字段。
  2. 使用 xargs 或管道操作将 cut 命令的输出传递给 ffprobe 命令。

以下是一个具体的示例:

假设你有一个文本文件 audio_info.txt,其中包含了一系列的视频文件路径,路径之间用"|"分隔。你想要使用 ffprobe 来获取每个视频文件的元数据。

bash 复制代码
# 使用 cut 命令按"|"分隔,并提取所有字段
cut -d'|' -f1 audio_info.txt | xargs -I % ffprobe -v error -show_format  -print_format json=compact=1 %

在这个示例中:

  • cut -d'|' -f1 audio_info.txt 命令按"|"分隔符分割 audio_info.txt 文件中的内容,并提取第一个字段(即第一个视频文件路径)。
  • xargs -I % ffprobe ... 命令使用 xargs 将 cut 命令的输出作为 ffprobe 命令的参数。-I % 选项告诉 xargs 将每个输入项替换为 % 符号,这个符号在 ffprobe 命令中会被替换为实际的视频文件路径。
  • ffprobe -v error -print_format json=compact=1 % 命令使用 ffprobe 工具来获取视频文件的元数据。-v error 选项抑制无关的输出,-print_format json=compact=1 指定输出格式为紧凑的 JSON。

请注意,ffprobe 命令中的 % 符号会被 xargs 替换为 cut 命令的输出,即每个视频文件的路径。

输出结果:

bash 复制代码
{
    "format": { "filename": "/data/htdocs/demo/GPT-SoVITS/GPT-SoVITS/output/ambor/slicer_opt/vocal_原音频.wav.reformatted.wav_10.wav_0000000000_0000280800_0.000-4.680.wav", "nb_streams": 1, "nb_programs": 0, "format_name": "wav", "format_long_name": "WAV / WAVE (Waveform Audio)", "duration": "4.690431", "size": "827470", "bit_rate": "1411332", "probe_score": 99,
        "tags": { "encoder": "Lavf58.29.100" } }
}
{
    "format": { "filename": "/data/htdocs/demo/GPT-SoVITS/GPT-SoVITS/output/ambor/slicer_opt/vocal_原音频.wav.reformatted.wav_10.wav_0000285600_0000729600_4.760-12.160.wav", "nb_streams": 1, "nb_programs": 0, "format_name": "wav", "format_long_name": "WAV / WAVE (Waveform Audio)", "duration": "7.407166", "size": "1306702", "bit_rate": "1411284", "probe_score": 99,
        "tags": { "encoder": "Lavf58.29.100" } }
}
{
    "format": { "filename": "/data/htdocs/demo/GPT-SoVITS/GPT-SoVITS/output/ambor/slicer_opt/vocal_原音频.wav.reformatted.wav_10.wav_0000729600_0001055400_12.160-17.590.wav", "nb_streams": 1, "nb_programs": 0, "format_name": "wav", "format_long_name": "WAV / WAVE (Waveform Audio)", "duration": "5.433469", "size": "958542", "bit_rate": "1411314", "probe_score": 99,
        "tags": { "encoder": "Lavf58.29.100" } }
}
{
    "format": { "filename": "/data/htdocs/demo/GPT-SoVITS/GPT-SoVITS/output/ambor/slicer_opt/vocal_原音频.wav.reformatted.wav_10.wav_0001055400_0001315800_17.590-21.930.wav", "nb_streams": 1, "nb_programs": 0, "format_name": "wav", "format_long_name": "WAV / WAVE (Waveform Audio)", "duration": "4.342132", "size": "766030", "bit_rate": "1411343", "probe_score": 99,
        "tags": { "encoder": "Lavf58.29.100" } }
}
{
    "format": { "filename": "/data/htdocs/demo/GPT-SoVITS/GPT-SoVITS/output/ambor/slicer_opt/vocal_原音频.wav.reformatted.wav_10.wav_0001315800_0001579200_21.930-26.320.wav", "nb_streams": 1, "nb_programs": 0, "format_name": "wav", "format_long_name": "WAV / WAVE (Waveform Audio)", "duration": "4.388571", "size": "774222", "bit_rate": "1411342", "probe_score": 99,
        "tags": { "encoder": "Lavf58.29.100" } }
}
{
    "format": { "filename": "/data/htdocs/demo/GPT-SoVITS/GPT-SoVITS/output/ambor/slicer_opt/vocal_原音频.wav.reformatted.wav_10.wav_0001579200_0001821000_26.320-30.350.wav", "nb_streams": 1, "nb_programs": 0, "format_name": "wav", "format_long_name": "WAV / WAVE (Waveform Audio)", "duration": "4.014150", "size": "708174", "bit_rate": "1411355", "probe_score": 99,
        "tags": { "encoder": "Lavf58.29.100" } }

如果你想要对 audio_info.txt 文件中的每个视频文件都执行 ffprobe 命令,你可以省略 -f1 选项,并且不需要 xargs 中的 -I % 替换,因为 cut 命令的输出将直接通过管道传递给 ffprobe 命令:

bash 复制代码
cut -d'|' audio_info.txt | ffprobe -v error -show_entries format=% -print_format json=compact=1 %

在这个命令中,cut 命令的输出将通过管道直接传递给 ffprobe 命令,每个视频文件路径都会依次作为 ffprobe 命令的参数。

相关推荐
乐橙开放平台40 分钟前
智慧连锁客流检测和离岗检测怎么对接
大数据·人工智能·笔记·物联网·自动化·音视频·智能家居
Anhty3 小时前
2026最新免费手机音频处理工具 !!
android·功能测试·ios·智能手机·音视频
企业数字化笔记4 小时前
AI工具参数很多怎么办?预设、表单校验、危险参数与配置审计
java·spring boot·python·音视频
VidDown4 小时前
上传 2GB 文件别让 Django 接:分片上传、对象存储直传与秒传
python·django·音视频·状态模式·实时音视频·视频编解码·视频
阿明副业观察5 小时前
AI视频生成工具功能与作用全面解析:赋能高效内容创作
大数据·人工智能·aigc·音视频·ai写作
EasyDSS6 小时前
告别视频资源浪费!云点播/本地点播/网络点播EasyDSS平台点播实现企业视频高效复用
音视频·媒体·easydss
智能直播6 小时前
RK3528 Tinyalsa/ALSA框架:输入源声音获取与HDMI out声音输出,一文讲透直播音频链路
音视频·实时音视频·视频编解码
镭封6 小时前
做电视剧解说视频用什么软件?配音、文案处理一次解决
人工智能·小程序·音视频·语音识别·媒体
VidDown8 小时前
自动给视频挑一张能看的封面:帧评分、构图与批量生成
python·ffmpeg·音视频·视频
AliCloudROS9 小时前
MiniMax-H3 视频生成模型 — 一键部署与使用指南
人工智能·音视频