首页 > 编程学习 > 【工具】使用FFmpeg压缩视频

【工具】使用FFmpeg压缩视频

发布时间:2022/2/7 9:37:03

写了一个工具,下面是下载地址:(注意编码问题)
https://download.csdn.net/download/eclipse_c/12269351


自从入手了osmo action之后,硬盘容量是一个让人头疼的问题,面对有些可以留可不留的视频还舍不得删,所以找个方法来压缩视频是最好的了。最后找到FFmpeg这个程序,基本上满足了我的要求。之前还找到了一个x264的程序,也可以压缩视频,但是没有声音,就放弃了。另外使用这个工具压缩时间也比较短

FFmpeg 下载: https://ffmpeg.zeranoe.com/builds/

下载好之后,可以在bin/目录找到3个exe程序,分别为ffmepgffplayffprobe。这里只是使用到ffmepg.exe

@echo off:: -s 1280x720  调整分辨率,对视频体积基本上无影响
:: -r 30 设置为30帧,对体积基本上无影响
:: -b 10000k  码率设置,osmo action 默认原始视频的码率为80000kffmpeg.exe -i DJI_0339.MP4 -b 10000k out.mp4pause

windows下的batch脚本如上,输入文件为DJI_0339.MP4,分辨率为1080p 60帧,码率设置为10000k,输出文件名为out.mp4
原始视频体积为493619kb(482MB),压缩过之后的out.mp4大小为64530kb(63MB),压缩倍率差不多为8倍,(码率与原始码率相差8倍)画质略有牺牲,但是作为不重要的视频文件来讲,足够用了。

其中还有一些参数,会修改分辨率以及帧率,经过测试对视频的体积基本上没有影响,所以就只是设置下码率即可。


抽空写了一个C#的程序,来生成中间的batch脚本

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApplication2
{class Program{static List<string> fileList = new List<string>();static void writeCommand(){string path = Directory.GetCurrentDirectory() + "\\" + "run.bat";if(File.Exists(path)){File.Delete(path);}System.IO.File.WriteAllLines(path, fileList, Encoding.Default);}static void genCommand(string source, string dst, string bitRate = "10000k"){DirectoryInfo folder = new DirectoryInfo(source);if (!folder.Exists){Console.WriteLine(string.Format("{0} folder does not exist!", folder.FullName));return;}DirectoryInfo dst_folder = new DirectoryInfo(dst);if(!dst_folder.Exists){dst_folder.Create();Console.WriteLine(string.Format("create folder: {0}", dst_folder.FullName));}fileList.Add("@echo off");fileList.Add(":: -s 1280x720, reslution");fileList.Add(":: -r 30, frames per second");fileList.Add(":: -b 10000k, [EFFECT SIZE OF FILE] set rate, default osmo action vedio rate is 80000k");foreach(FileInfo file in folder.GetFiles()){if(file.Extension.ToUpper() == ".MP4"){string command = string.Format("ffmpeg.exe -i {0} -b {1} {2}\\{3}", source + "\\" + file.Name, bitRate, dst_folder.Name, file.Name);fileList.Add(command);Console.WriteLine(command);}}fileList.Add("pause");}static void Main(string[] args){if(args.Length < 2){Console.WriteLine("Create bat script for compress vedio.\nUsage: \narg[0]:MP4 source files folder\narg[1]:dest folder\narg[2]:bit rate(default 10000k)");}else{Console.WriteLine(string.Format("{0} {1} {2}", args[0], args[1], args[2]));genCommand(args[0], args[1], args[2]);writeCommand();}Console.WriteLine("\nJob Done!\nPress any key to continue...");Console.ReadKey();}}
}

上述代码生成Compress.exe程序,然后在命令行这样调用(也可以写一个bat脚本):

compress.exe 100MEDIA dest 8000k

会生成一个run.bat
然后在运行run.bat即可压缩。(Compress.exe要与ffmpeg.exe放在同级目录中)

其中run.bat生成的脚本内容如下:

@echo off
:: -s 1280x720, reslution
:: -r 30, frames per second
:: -b 10000k, [EFFECT SIZE OF FILE] set rate, default osmo action vedio rate is 80000k
ffmpeg.exe -i 100MEDIA\compose_video_1575107439089.mp4 -b 8000k dest\compose_video_1575107439089.mp4
ffmpeg.exe -i 100MEDIA\DJI_0128.MP4 -b 8000k dest\DJI_0128.MP4
ffmpeg.exe -i 100MEDIA\DJI_0129.MP4 -b 8000k dest\DJI_0129.MP4
ffmpeg.exe -i 100MEDIA\DJI_0130.MP4 -b 8000k dest\DJI_0130.MP4
ffmpeg.exe -i 100MEDIA\DJI_0131.MP4 -b 8000k dest\DJI_0131.MP4
ffmpeg.exe -i 100MEDIA\DJI_0131_001.MP4 -b 8000k dest\DJI_0131_001.MP4
ffmpeg.exe -i 100MEDIA\DJI_0143.MP4 -b 8000k dest\DJI_0143.MP4
ffmpeg.exe -i 100MEDIA\DJI_0151.MP4 -b 8000k dest\DJI_0151.MP4
ffmpeg.exe -i 100MEDIA\DJI_0155.MP4 -b 8000k dest\DJI_0155.MP4
pause

需要注意的是文件的编码,因为编码问题,可能会导致中文路径会报错


本文链接:https://www.ngui.cc/51cto/show-312.html
Copyright © 2010-2022 ngui.cc 版权所有 |关于我们| 联系方式| 豫B2-20100000