使用FFmpeg将视频帧转换为png图像

该文章提供了一个使用FFmpeg和Pythonmultiprocessing库将大量MP4视频文件转换为PNG图像的代码实例。通过指定输入地址、图片分辨率和帧数,程序能创建多进程并行处理视频帧转图片的任务,将结果存储在与视频同名的文件夹中。
摘要由CSDN通过智能技术生成

使用FFmpeg将视频帧转换为png图像


前言

一个使用ffmpeg多进程将大量mp4文件转换为对应多帧png/jpg/bmp等图片文件的代码实例,其中png存储于与视频同名的文件夹当中。


一、核心命令

ffmpeg -i *.mp4 -s 256x256 -r 25 %8d.png

其中 -i 指 输入地址
-s 指定图片分辨率
-r 指定帧数

二、代码实例

核心思想使用 multiprocessing 读取 MP4 文件列表,更改命名方式进行存储

import os
import argparse
from typing import List, Dict
from multiprocessing import Pool
import subprocess
from subprocess import Popen, PIPE
from glob import glob
from tqdm import tqdm, trange


def clip_vid2png(source_dir: os.PathLike, output_dir: os.PathLike, num_workers: int):
    os.makedirs(output_dir, exist_ok=True)
    # os.makedirs(os.path.join(output_dir, '_videos_raw'), exist_ok=True)
    import pdb;pdb.set_trace()
    video_queue = construct_video_queue(source_dir)
    task_kwargs = [dict(
        video_path=vd,  # 视频路径
        png_path= os.path.join(output_dir, os.path.basename(vd))# 图像存储路径
     ) for vd in video_queue]
    pool = Pool(processes=num_workers)
    tqdm_kwargs = dict(total=len(task_kwargs), desc=f'Clips videos into {output_dir}')

    for _ in tqdm(pool.imap_unordered(task_proxy_clip, task_kwargs), **tqdm_kwargs):
        pass

    print('Clip is finished')


def construct_video_queue(source_dir: os.PathLike) -> List[Dict]:
    video_queue = sorted(glob(os.path.join(source_dir, "*.mp4")))
    return video_queue

def task_proxy_clip(kwargs):
    return clip_video(**kwargs)

def clip_video(video_path, png_path):
    os.makedirs(png_path, exist_ok=True)
    command = [
            "ffmpeg",
            "-loglevel", "quiet", 
            "-i",
            f"{video_path}", 
            "-s", "256x256",
            "-r", "25",
            f"{png_path}/%08d.png"
        ]
    return_code = subprocess.call(command)
    return return_code


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="clip video to png")
    parser.add_argument('-s', '--source_dir', type=str, default=None, help='Path to the directory with the dataset')
    parser.add_argument('-o', '--output_dir', type=str, default=None, help='Where to save the videos?')
    parser.add_argument('-w', '--num_workers', type=int, default=4, help='Number of workers for downloading')
    args = parser.parse_args()

    clip_vid2png(
        args.source_dir,
        args.output_dir,
        args.num_workers,
    )

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将视频转换PNG格式,可以使用Android提供的MediaMetadataRetriever类来获取视频中的,并将其转换PNG格式。具体步骤如下: 1. 创建一个MediaMetadataRetriever对象,并使用setDataSource()方法设置要从中提取视频的路径。 2. 使用getFrameAtTime()方法获取视频中的。此方法需要两个参数:时间戳(以微秒为单位)和的选项(默认为OPTION_CLOSEST_SYNC)。 3. 将获取到的转换PNG格式。可以使用Bitmap.compress()方法将Bitmap对象转换PNG格式,并将其保存到文件中。 以下是示例代码: ``` MediaMetadataRetriever retriever = new MediaMetadataRetriever(); retriever.setDataSource(videoPath); // 获取视频时长 String duration = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); // 将视频多个时间段,每个时间段取一帧 for (int i = 0; i < Integer.parseInt(duration); i += 1000) { Bitmap frame = retriever.getFrameAtTime(i * 1000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC); // 将Bitmap对象转换PNG格式,并保存到文件中 FileOutputStream out = new FileOutputStream("frame" + i + ".png"); frame.compress(Bitmap.CompressFormat.PNG, 100, out); out.close(); } retriever.release(); ``` 要使用FFmpeg将单个图像转换为Android视频,可以使用以下命令: ``` ffmpeg -loop 1 -i input.png -c:v libx264 -t 10 -pix_fmt yuv420p output.mp4 ``` 其中,input.png是要转换图像文件名,output.mp4是输出的视频文件名。-loop 1选项表示将图像循环播放,-c:v libx264选项指定使用libx264编码器进行视频编码,-t 10选项表示将视频长度设置为10秒,-pix_fmt yuv420p选项表示使用yuv420p像素格式进行编码。 可以使用FFmpeg的JNI接口在Android应用程序中执行此命令。以下是示例代码: ``` String[] command = {"ffmpeg", "-loop", "1", "-i", "input.png", "-c:v", "libx264", "-t", "10", "-pix_fmt", "yuv420p", "output.mp4"}; FFmpeg.execute(command); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值