ffmpeg将avi转为mp4 & ffmpeg将png转jpg & ffmpeg修改图片视频的尺寸 & ffmpeg旋转视频 & ffmpeg命令大全

文章目录

  • 图片操作
    • 对一个3840x1920的图片的高进行上下填充,形成3840x2160
    • 将一个图片宽缩放为640,高等比例缩放
    • png转jpg命令
    • png_to_jpg_2025_6_3.py
    • 将图片顺时针旋转90度命令
    • rotate_90_2025_6_3.py
  • 视频操作
    • ffmpeg水平翻转,垂直翻转,顺时针旋转180度
    • ffmpeg去掉一个视频的音频
    • 将视频尺寸转为640x360 (w x h)
  • 将视频尺寸转为640x360同时去掉音频
    • avi转mp4的同时保留音频
    • 转mp4的同时移除视频的音频流
    • 给出两个视频 video1和video2,用ffmpeg将这两个视频左右拼接在一起

图片操作

对一个3840x1920的图片的高进行上下填充,形成3840x2160

ffmpeg -i 4k_360_square.jpg -vf "pad=3840:2160:0:120:black" 4k_360_square_.jpg

将一个图片宽缩放为640,高等比例缩放

ffmpeg -i input.jpg -vf "scale=640:-1" output.jpg

png转jpg命令

ffmpeg -i output.png -q:v 2 output.jpg

png_to_jpg_2025_6_3.py

import os
import subprocess
import shutil
import sys

def convert_png_to_jpg(input_dir, output_dir, quality=2):
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    for filename in os.listdir(input_dir):
        if filename.lower().endswith(".png"):
            input_path = os.path.join(input_dir, filename)
            output_filename = os.path.splitext(filename)[0] + ".jpg"
            output_path = os.path.join(output_dir, output_filename)

            cmd = [
                "ffmpeg",
                "-i", input_path,
                "-q:v", str(quality),
                output_path
            ]

            print(f"Converting {filename} to {output_filename}")
            try:
                subprocess.run(cmd, check=True)
            except subprocess.CalledProcessError as e:
                print(f"Error converting {filename}: {e}")

def move_jpg_and_delete_png(input_dir, output_dir):
    # 移动所有 jpg 文件到 input_dir
    for filename in os.listdir(output_dir):
        if filename.lower().endswith(".jpg"):
            src = os.path.join(output_dir, filename)
            dst = os.path.join(input_dir, filename)
            print(f"Moving {filename} back to input directory...")
            shutil.move(src, dst)

    # 删除 input_dir 中的所有 png 文件
    for filename in os.listdir(input_dir):
        if filename.lower().endswith(".png"):
            file_path = os.path.join(input_dir, filename)
            print(f"Deleting {filename}")
            os.remove(file_path)

if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("Usage: python convert.py  ")
        sys.exit(1)

    input_directory = sys.argv[1]
    output_directory = sys.argv[2]

    if not os.path.isdir(input_directory):
        print(f"Error: Input directory '{input_directory}' does not exist.")
        sys.exit(1)

    print("Starting PNG to JPG conversion...")
    convert_png_to_jpg(input_directory, output_directory)

    print("\nOptions:")
    print("Enter 1 to: Move all converted JPGs back to input folder and delete original PNGs")
    choice = input("Do you want to proceed? (Enter 1 or any other key to skip): ")

    if choice.strip() == "1":
        move_jpg_and_delete_png(input_directory, output_directory)
        print("\nOperation completed.")
    else:
        print("\nSkipped moving and deleting files.")

    print("\nAll done.")

将图片顺时针旋转90度命令

ffmpeg -i input.jpg -vf "transpose=1" output.jpg

rotate_90_2025_6_3.py

import os
import subprocess
import shutil
import sys

# 支持的图像格式列表
SUPPORTED_EXTENSIONS = ('.png', '.jpg', '.jpeg', '.bmp', '.tiff', '.gif')

def rotate_images(input_dir, output_dir, clockwise=True):
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    # 设置旋转角度:顺时针 90 度
    rotation_angle = "transpose=1"

    for filename in os.listdir(input_dir):
        if filename.lower().endswith(SUPPORTED_EXTENSIONS):
            input_path = os.path.join(input_dir, filename)
            output_path = os.path.join(output_dir, filename)

            cmd = [
                "ffmpeg",
                "-i", input_path,
                "-vf", rotation_angle,
                "-q:v", "2",   # 保持高质量
                "-y",          # 自动覆盖已有文件
                output_path
            ]

            print(f"Rotating {filename}...")
            try:
                subprocess.run(cmd, check=True)
            except subprocess.CalledProcessError as e:
                print(f"Error rotating {filename}: {e}")

def move_rotated_back(input_dir, output_dir):
    # 将旋转后的图片移回原目录(覆盖)
    for filename in os.listdir(output_dir):
        if filename.lower().endswith(SUPPORTED_EXTENSIONS):
            src = os.path.join(output_dir, filename)
            dst = os.path.join(input_dir, filename)
            print(f"Moving and replacing: {filename}")
            shutil.move(src, dst)

if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("Usage: python rotate.py  ")
        sys.exit(1)

    input_directory = sys.argv[1]
    output_directory = sys.argv[2]

    if not os.path.isdir(input_directory):
        print(f"Error: Input directory '{input_directory}' does not exist.")
        sys.exit(1)

    print("Starting image rotation (90 degrees clockwise)...")
    rotate_images(input_directory, output_directory)

    # 判断是否为同一目录
    input_abs = os.path.abspath(input_directory)
    output_abs = os.path.abspath(output_directory)

    if input_abs == output_abs:
        print("\nInput and output directories are the same. Automatically replacing original images.")
        move_rotated_back(input_directory, output_directory)
        print("\nAll files have been replaced with rotated versions.")
    else:
        print("\nImages have been rotated and saved to the output directory.")
        print(f"You can find them in: {output_directory}")

    print("\nAll done.")

视频操作

ffmpeg水平翻转,垂直翻转,顺时针旋转180度

水平翻转

ffmpeg -i input.mp4 -vf "hflip" output.mp4

垂直翻转

ffmpeg -i input.mp4 -vf "vflip" output.mp4

顺时针旋转180度

ffmpeg -i input.mp4 -vf "hflip,vflip" output.mp4

ffmpeg去掉一个视频的音频

ffmpeg -i input.mp4 -an -c:v copy output.mp4

将视频尺寸转为640x360 (w x h)

ffmpeg -i input.mp4 -vf "scale=640:360" -c:a copy output.mp4

保证清晰度

ffmpeg -i input.mp4 -vf "scale=640:360:flags=lanczos" -c:v libx264 -preset slow -crf 18 -c:a copy output.mp4

将视频尺寸转为640x360同时去掉音频

ffmpeg -i 2025_5_28_12_00_d9_3f.mp4 -vf "scale=640:360" -c:v libx264 -an 2025_5_28_12_00_d9_3f_640_360.mp4

avi转mp4的同时保留音频

ffmpeg -i input.avi -vcodec libx264 -acodec aac output.mp4
-vcodec libx264:指定使用 H.264 视频编码器。
-acodec aac:指定使用 AAC 音频编码器。
生成的文件通常具有较高的兼容性,适用于大多数播放器和设备。

转mp4的同时移除视频的音频流

ffmpeg -i input.avi -an -vcodec libx264 output.mp4
ffmpeg -i input.avi -vcodec libx264 -crf 23 -preset medium -an output_without_audio.mp4
-i input.avi:指定输入的 AVI 文件。
-vcodec libx264:将视频编码为 H.264 格式(适合 MP4 文件)。
-crf 23:设置视频质量,23 是默认值,范围是 0(无损)到 51(最低质量),数值越小质量越高。
-preset medium:设置编码速度与压缩效率的平衡,medium 是默认值(可选值包括 ultrafast, fast, slow, veryslow 等)。
-an:移除音频流。
output_without_audio.mp4:指定输出的 MP4 文件名。

给出两个视频 video1和video2,用ffmpeg将这两个视频左右拼接在一起

ffmpeg -i video1.mp4 -i video2.mp4 -filter_complex "hstack" output.mp4

你可能感兴趣的:(嵌入式人工智能,ffmpeg)