鱼C论坛

 找回密码
 立即注册
查看: 668|回复: 3

如何用ffmpeg 或者更简单的办法判断文件是视频 还是 音频?

[复制链接]
发表于 2024-10-22 12:36:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如何用ffmpeg 或者更简单的办法判断文件是视频 还是 音频?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-10-22 12:37:07 | 显示全部楼层
使用 `ffmpeg` 可以非常方便地判断文件是视频还是音频。以下是一个简单的方法:

### 使用 ffprobe:
`ffprobe` 是 `ffmpeg` 的一个工具,可以用于分析多媒体文件。

  1. ffprobe -v error -show_entries stream=codec_type -of csv=p=0 <文件名>
复制代码


### 解释:
- `-v error`:仅显示错误信息,避免冗长的输出。
- `-show_entries stream=codec_type`:仅显示流的类型信息。
- `-of csv=p=0`:以 CSV 格式输出并且不显示列标题。

### 结果分析:
- 如果输出包含 `video`,那么文件是一个视频文件。
- 如果输出只有 `audio`,那么文件是一个音频文件。

### 更简单的方法(基于文件扩展名):
虽然不如 `ffprobe` 精确,但基于文件扩展名判断也是一种快速方法。注意这可能不总是准确:

  1. import mimetypes

  2. def is_video_or_audio(file_path):
  3.     mime_type, _ = mimetypes.guess_type(file_path)
  4.     if mime_type:
  5.         if mime_type.startswith('video'):
  6.             return 'video'
  7.         elif mime_type.startswith('audio'):
  8.             return 'audio'
  9.     return 'unknown'

  10. # 用法
  11. print(is_video_or_audio('example.mp4'))  # 输出:video
  12. print(is_video_or_audio('example.mp3'))  # 输出:audio
复制代码


这种方法简单快速,但`ffprobe` 更可靠,因为它直接读取文件流信息,而不是依赖文件名。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-22 13:26:48 | 显示全部楼层
FishC 发表于 2024-10-22 12:37
使用 `ffmpeg` 可以非常方便地判断文件是视频还是音频。以下是一个简单的方法:

### 使用 ffprobe:

如果输出包含 `video`,那么文件是一个视频文件

那怎么把 ‘ ffprobe -v error -show_entries stream=codec_type -of csv=p=0 <文件名>’ 的输出存入变量,再判断其中是否有 video 或者 audio 字样呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-22 13:26:54 | 显示全部楼层
blackantt 发表于 2024-10-22 13:26
如果输出包含 `video`,那么文件是一个视频文件

那 ...


你可以使用 Python 的 `subprocess` 模块来运行 `ffprobe` 命令并捕获其输出,然后对输出进行分析。以下是实现步骤:

1. 使用 `subprocess.run` 执行 `ffprobe` 命令。
2. 捕获命令输出。
3. 判断输出中是否包含 `video` 或 `audio`。

Here's a complete example:

  1. import subprocess

  2. def check_media_type(file_path):
  3.     # 执行 ffprobe 命令并捕获输出
  4.     result = subprocess.run(
  5.         ['ffprobe', '-v', 'error', '-show_entries', 'stream=codec_type', '-of', 'csv=p=0', file_path],
  6.         stdout=subprocess.PIPE,
  7.         stderr=subprocess.PIPE,
  8.         text=True
  9.     )
  10.    
  11.     if result.stdout:
  12.         output = result.stdout.strip().split('\n')
  13.         if 'video' in output:
  14.             return 'video'
  15.         elif 'audio' in output:
  16.             return 'audio'
  17.     return 'unknown'

  18. # 用法
  19. file_path = 'example.mp4'
  20. media_type = check_media_type(file_path)
  21. print(f'The file is a {media_type}')
复制代码


### 解释:

- `subprocess.run`:用于执行命令;
  - `stdout=subprocess.PIPE`:捕获标准输出;
  - `stderr=subprocess.PIPE`:捕获标准错误输出;
  - `text=True`:将输出作为文本处理,而不是字节。

- `result.stdout.strip().split('\n')`:去掉输出的空格并按行分割。

通过这个方法,你可以将 `ffprobe` 的输出存入变量,并根据内容判断文件的类型。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-19 16:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表