如何使用FFmpeg解析你想要的图片

504 阅读5分钟

说明:最近遇到了一个关于apng动图的问题,压缩与未压缩加载情况下,未压缩的图片竟然加载不成功,在代码层面看是因为图片的流内容大小造成的越界问题,就想看一下两张图片有啥区别所以,就去下载了个 FFmpeg这个著名的库,去看看两张图片具体的区别。

例子:查看图片的命令如下:

ffprobe -v error -show_format -show_streams image.jpg

texttoimagPrompt.jpeg 输出内容:

[STREAM]

index=0

codec_name=mjpeg

codec_long_name=Motion JPEG

profile=Baseline

codec_type=video

codec_tag_string=[0][0][0][0]

codec_tag=0x0000

width=450

height=675

coded_width=450

coded_height=675

closed_captions=0

film_grain=0

has_b_frames=0

sample_aspect_ratio=1:1

display_aspect_ratio=2:3

pix_fmt=yuvj444p

level=-99

color_range=pc

color_space=bt470bg

color_transfer=unknown

color_primaries=unknown

chroma_location=center

field_order=unknown

refs=1

id=N/A

r_frame_rate=25/1

avg_frame_rate=25/1

time_base=1/25

start_pts=0

start_time=0.000000

duration_ts=1

duration=0.040000

bit_rate=N/A

max_bit_rate=N/A

bits_per_raw_sample=8

nb_frames=N/A

nb_read_frames=N/A

nb_read_packets=N/A

DISPOSITION:default=0

DISPOSITION:dub=0

DISPOSITION:original=0

DISPOSITION:comment=0

DISPOSITION:lyrics=0

DISPOSITION:karaoke=0

DISPOSITION:forced=0

DISPOSITION:hearing_impaired=0

DISPOSITION:visual_impaired=0

DISPOSITION:clean_effects=0

DISPOSITION:attached_pic=0

DISPOSITION:timed_thumbnails=0

DISPOSITION:non_diegetic=0

DISPOSITION:captions=0

DISPOSITION:descriptions=0

DISPOSITION:metadata=0

DISPOSITION:dependent=0

DISPOSITION:still_image=0

DISPOSITION:multilayer=0

[/STREAM]

[FORMAT]

filename=/Users/tanguiwu/comfy-image/texttoimagPrompt.jpeg

nb_streams=1

nb_programs=0

nb_stream_groups=0

format_name=image2

format_long_name=image2 sequence

start_time=0.000000

duration=0.040000

size=365341

bit_rate=73068200

probe_score=50

[/FORMAT]

解释说明:

#### [STREAM] 部分

-   `index=0`:流的索引号,表示这是文件中的第一个流。
-   `codec_name=mjpeg`:流的编码格式,这里是 Motion JPEG。
-   `codec_long_name=MJPEG (Motion JPEG)`:编码格式的详细名称。
-   `codec_type=video`:流的类型,这里是视频流。
-   `codec_time_base=0/1`:时间基准,用于时间戳计算。
-   `codec_tag_string=[0][0][0][0]`:编码标签的字符串表示。
-   `codec_tag=0x0000`:编码标签的十六进制表示。
-   `width=1920`:图像的宽度(像素)。
-   `height=1080`:图像的高度(像素)。
-   `coded_width=1920`:编码后的图像宽度。
-   `coded_height=1080`:编码后的图像高度。
-   `has_b_frames=0`:是否包含 B 帧,这里为 0 表示没有 B 帧。
-   `sample_aspect_ratio=N/A`:采样纵横比,不适用于静态图像。
-   `display_aspect_ratio=N/A`:显示纵横比,不适用于静态图像。
-   `pix_fmt=yuvj420p`:像素格式,这里是 YUV 4:2:0。
-   `level=-99`:编码级别,-99 表示未定义。
-   `color_range=pc`:颜色范围,这里是全范围(PC 范围)。
-   `color_space=bt470bg`:颜色空间,这里是 BT.470 BG。
-   `color_transfer=bt470bg`:颜色传输特性,这里是 BT.470 BG。
-   `color_primaries=bt470bg`:颜色原色,这里是 BT.470 BG。

#### [FORMAT] 部分

-   `filename=image.jpg`:文件名。
-   `nb_streams=1`:文件中的流数量,这里是 1。
-   `nb_programs=0`:文件中的节目数量,这里是 0。
-   `format_name=jpeg_pipe`:文件格式名称,这里是 JPEG 管道。
-   `format_long_name=piped jpeg sequence`:文件格式的详细名称。
-   `start_time=N/A`:文件的开始时间,不适用于静态图像。
-   `duration=N/A`:文件的持续时间,不适用于静态图像。
-   `size=1048576`:文件大小(字节)。
-   `bit_rate=N/A`:比特率,不适用于静态图像。
-   `probe_score=50`:探测得分,用于表示文件格式探测的置信度。

### 总结

通过 `ffprobe -v error -show_format -show_streams image.jpg` 命令,你可以获取图像文件的详细信息,包括编码格式、分辨率、像素格式、颜色空间等。这

image.png

至于对于不知道如何安装该库的人来说,下面提供了一整个安装流程,有需要请看:

一、安装 FFmpeg这个著名的库,去看看两张图片具体的区别。

  1. 使用 Homebrew 安装: Homebrew 是 macOS 上的一个包管理工具,可以方便地安装各种软件。首先,确保你已经安装了 Homebrew。如果没有安装,可以通过以下命令安装 Homebrew:

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    

    然后,使用 Homebrew 安装 FFmpeg:

    brew install ffmpeg
    
  2. 验证安装: 安装完成后,可以通过以下命令验证 FFmpeg 是否安装成功:

    ffmpeg -version
    

    如果安装成功,你会看到 FFmpeg 的版本信息。

二、使用 FFmpeg

FFmpeg 的基本用法是通过命令行进行操作。以下是一些常见的使用示例:

  1. 转换视频格式: 将一个视频文件从一种格式转换为另一种格式。例如,将 MP4 文件转换为 AVI 文件:

    ffmpeg -i input.mp4 output.avi
    
  2. 提取音频: 从视频文件中提取音频。例如,从 MP4 文件中提取音频并保存为 MP3 文件:

    ffmpeg -i input.mp4 -q:a 0 -map a output.mp3
    
  3. 合并视频文件: 将多个视频文件合并为一个文件。首先,创建一个包含所有要合并文件的列表文件 filelist.txt,内容如下:

    file 'input1.mp4'
    file 'input2.mp4'
    file 'input3.mp4'
    

    然后,使用以下命令合并视频文件:

    ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4
    
  4. 压缩视频: 压缩视频文件以减小文件大小。例如,将 MP4 文件压缩为较小的 MP4 文件:

    ffmpeg -i input.mp4 -vcodec libx264 -crf 28 output.mp4
    
  5. 裁剪视频: 裁剪视频文件。例如,将视频的前 30 秒裁剪出来:

    ffmpeg -i input.mp4 -ss 00:00:00 -t 00:00:30 -c copy output.mp4
    
  6. 添加水印: 在视频中添加水印。例如,将 watermark.png 添加到视频的右上角:

    ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=W-w-10:10" output.mp4
    

三、帮助和文档

FFmpeg 提供了丰富的命令行选项和参数,可以通过以下命令查看帮助和文档:

ffmpeg -h

参考链接:FFmpeg 官方文档