最近在处理上传视频,需要获取视频信息和截图,这里就需要用到ffmpeg;

由于我的项目是在docker compose中运行调试,所以ffmpeg也需要在docker中能调用;

网上找到的方法在Dockerfile中安装ffmpeg;

.net core 运行的docker容器可以理解为一个安装了.net core runtime的轻量型linux,所以我们要在docker中调用ffmpeg,就需要在这个linux中安装ffmpeg;

下面是我的Dockerfile 重点是前面的两个RUN 命令,复制这两个RUN 到Dockerfile就可以。(因为我还需要处理Excel所以使用了NPOI,这个linux下也是要安装libgdiplus才能运行;)

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base

RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list \
&& apt-get update \
&& apt-get install -y ffmpeg \
&& apt-get clean && apt-get autoclean && apt-get autoremove \
&& rm -rf /var/lib/apt/lists/* RUN apt-get update && apt-get install -y libgdiplus libc6-dev && ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
WORKDIR /app
EXPOSE 80
EXPOSE 443 FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["test/test.csproj", "test/"]
RUN dotnet restore "test/test.csproj"
COPY . .
WORKDIR "/src/test"
RUN dotnet build "test.csproj" -c Release -o /app/build FROM build AS publish
RUN dotnet publish "test.csproj" -c Release -o /app/publish FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
VOLUME /app/wwwroot
ENTRYPOINT ["dotnet", "test.dll"]

然后就可以使用ffmpeg 命令了,我这里适配和window和linux 程序;

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks; namespace test.Ffmpeg
{
public static class FfmpegHelper
{
private static System.Diagnostics.ProcessStartInfo cmdFfmpeg;
private static System.Diagnostics.ProcessStartInfo cmdFfprobe;
static FfmpegHelper()
{ if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
string ffmpegPath = "/usr/bin/ffmpeg";
string ffprobePath = "/usr/bin/ffprobe";
cmdFfmpeg = new System.Diagnostics.ProcessStartInfo(ffmpegPath);
cmdFfprobe = new System.Diagnostics.ProcessStartInfo(ffprobePath);
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
string ffmpegPath = AppDomain.CurrentDomain.BaseDirectory+ "Ffmpeg\\ffmpeg.exe";
string ffprobePath = AppDomain.CurrentDomain.BaseDirectory + "Ffmpeg\\ffprobe.exe";
cmdFfmpeg = new System.Diagnostics.ProcessStartInfo(ffmpegPath);
cmdFfprobe = new System.Diagnostics.ProcessStartInfo(ffprobePath); }
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
string ffmpegPath = "/usr/bin/ffmpeg";
string ffprobePath = "/usr/bin/ffprobe";
cmdFfmpeg = new System.Diagnostics.ProcessStartInfo(ffmpegPath);
cmdFfprobe = new System.Diagnostics.ProcessStartInfo(ffprobePath);
} cmdFfmpeg.RedirectStandardError = false; // 输出错误
cmdFfmpeg.RedirectStandardOutput = true; //输出打印
cmdFfmpeg.UseShellExecute = false; //使用Shell
cmdFfmpeg.CreateNoWindow = true; //创建黑窗 cmdFfprobe.RedirectStandardError = false; //set false
cmdFfprobe.RedirectStandardOutput = true;
cmdFfprobe.UseShellExecute = false; //set true
cmdFfprobe.CreateNoWindow = true; //don't need the black window
} /// <summary>
/// 获取视频信息
/// </summary>
/// <param name="path"></param>
public static async Task<VideoInfoModel> GetVideoInfo(string path)
{
try
{
string command = $"-i {path} -print_format json -show_format -show_streams -show_data";
cmdFfprobe.Arguments = command; System.Diagnostics.Process cmd = new System.Diagnostics.Process();
cmd.StartInfo = cmdFfprobe;
cmd.Start(); string InfoStr = await cmd.StandardOutput.ReadToEndAsync();
cmd.WaitForExit(); VideoInfoModel resp = JsonConvert.DeserializeObject<VideoInfoModel>(InfoStr);
return resp;
}
catch (Exception)
{
return null;
} }
/// <summary>
/// 视频截图
/// </summary>
/// <param name="path"></param>
/// <param name="outPath"></param>
public static void VideoScreenshot(string path,string outPath)
{
string command = $"-i {path} -y -q:v 7 -f image2 -t 0.001 {outPath}"; cmdFfmpeg.Arguments = command; System.Diagnostics.Process cmd = new System.Diagnostics.Process();
cmd.StartInfo = cmdFfmpeg;
cmd.Start();
cmd.WaitForExit(); }
}
}

.net core Docker 容器添加ffmpeg 获取视频信息和截图的更多相关文章

  1. .NET 处理视频-MediaInfo 获取视频信息

    获取视频信息的组件很多,本节介绍的是:MediaFile. 第一步.添加 MediaInfoDotNet 在项目上右键,选择“管理 NuGet 程序包”,浏览以选中 MediaInfoDotNet,然 ...

  2. Android必知必会-获取视频文件的截图、缩略图

    背景 公司最近要求给我负责的APP加上视频录制和发布的功能,我简单的完成了基本的录制和视频压缩功能,后来发现发布接口需要上传视频的截图,网上搜索了一下资料,在这里整理一下. 代码实现 /** * 获取 ...

  3. 通过 ffmpeg 获取视频第一帧(指定时间)图片

    最近做一个上传教学视频的方法,上传视频的同时需要上传视频缩略图,为了避免用户上传的缩略图与视频内容不符,经理要求直接从上传的视频中截图视频的某一帧作为缩略图,并给我推荐了FFMPEG.FFMPEG 功 ...

  4. ffmpeg获取视频封面图片

    ffmpeg百度云盘下载地址:https://pan.baidu.com/s/1Am_x0abBvXTrbCFPHs5e9Q 提取码:4y2r /** * ffmpeg百度云盘下载地址:https:/ ...

  5. 给debian的docker容器添加crontab定时任务

    现在大部分的docke镜像是基于debian # cat /etc/issue Debian GNU/Linux 9 \n \l Docker容器是不支持后台服务的,像systemctl servic ...

  6. windows下使用ffmpeg进行视频转换和截图。

    author:fanfq(xiaoban) Email:fangqing.fan#gmail.comlink:http://fanfq.iteye.com/admin/blogs/655569chan ...

  7. 【docker】查看docker容器或镜像的详细信息命令,查看docker中正在运行的容器的挂载位置

    命令: docker inspect f257d69e0035 格式: docker inspect 容积或镜像ID 首先,docker ps获取简要信息 然后输入命令docker inspect   ...

  8. 解决UEditor编辑时,只添加视频内容,不添加文字,视频信息不能保存到数据库的问题

    造成这个问题的原因是富文本保存内容时会筛除空标签,然后统计是否有内容,通过字数统计也可以看到,上传完视频后字数还是零,因为视频上传后是<video></video>标签,这个标 ...

  9. .net core docker容器编排部署(linux)

    环境准备 需要一个linux操作系统:我这里用的是ubuntu 18.04,安装步骤就不说了,网上很多教程,当然也可以私信我. 既然需要用到docker,那么就安装个docker,apt instal ...

随机推荐

  1. K - Leapin' Lizards HDU - 2732 网络流

    题目链接:https://vjudge.net/contest/299467#problem/K 这个题目从数据范围来看可以发现是网络流,怎么建图呢?这个其实不是特别难,主要是读题难. 这个建图就是把 ...

  2. java并发之线程安全问题

    并发(concurrency)一个并不陌生的词,简单来说,就是cpu在同一时刻执行多个任务. 而Java并发则由多线程实现的. 在jvm的世界里,线程就像不相干的平行空间,串行在虚拟机中.(当然这是比 ...

  3. 面试官:你说你懂动态代理,那你知道为什么JDK中的代理类都要继承Proxy吗?

    之前我已经写过了关于动态代理的两篇文章,本来以为这块应该没啥问题,没想到今天又被难住了- 太难了!!! 之前文章的链接: 动态代理学习(一)自己动手模拟JDK动态代理. 动态代理学习(二)JDK动态代 ...

  4. gulp基本使用

    一.gulp是什么 gulp强调的是前端开发的工作流程,我们可以通过定义task事件定义事件的执行顺序,gulp去执行这些事件,构建整个前端开发的工作流程 gulp常见定义事件,例如: 变更静态资源 ...

  5. redis 集群安装

    redis集群安装 1.下载redis源码 2.解压并进入解压后的文件夹redis内 3.make,生成一系列的文件(mkreleasehdr.sh, redis-benchmark, redis-c ...

  6. 什么情况下不能使用 Java 泛型

    1. 前言 Java 1.5 引入了泛型来保证类型安全,防止在运行时发生类型转换异常,让类型参数化,提高了代码的可读性和重用率.但是有些情况下泛型也是不允许使用的,今天就总结一下编码中不能使用泛型的一 ...

  7. [hdu5593 ZYB's Tree] 树上统计

    题意:给1棵N(≤500,000)个节点的树,每条边边权为1,求距离每个点距离不超过K(K≤10)的点的个数的xor和. 思路:由于K很小,可以考虑把距离作为状态的一部分,然后研究父子之间状态的联系. ...

  8. 04JAVA基础数组

    概念 存储同一种数据类型的多种元素的容器 数组初始化 动态初始化 设定数组长度,系统自动分配默认值 int[] arr = new int[3]; 静态初始化 给定数组默认值,系统自动分配长度 int ...

  9. AT命令集详解

    1.2 AT的优点. 命令简单易懂,并且采用标准串口来收发AT命令,这样对设备控制大大简化了,转换成简单串口编程了. AT命令提供了一组标准的硬件接口--串口.这个简化的硬件设计.较新的电信网络模块, ...

  10. 黑马程序员_毕向东_Java基础视频教程——转义字符(随笔)

    转义字符 转义字符 通过 \ 来转变后面的字母或符号的含义 \n :换行 \b :退格.相当于 backspace \r : 相当于回车键. Windows系统中,回车是由两个字符来表示 \r \n. ...