零、前言

注:本文未完待续

首要思路:

运用 Golang 和 FFmpeg 交互能够分为以下几个过程:

  1. 装置 FFmpeg: 首要需求装置 FFmpeg,能够在终端中输入指令来装置。
  2. 创立一个Golang项目,并在其中创立一个接纳上传视频文件的接口。
  3. 在接口中接纳上传的文件,并运用Golang中的 exec 包来履行 FFmpeg 指令来转码视频。
  4. 转码后的文件能够保存在本地或上传到云存储服务器。
  5. 将视频信息存储到 MySQL 数据库中。
  6. 在Golang中运用GORM或其他ORM库来衔接数据库并存储数据。
  7. 在代码中运用 exec.Command 函数来履行 FFmpeg 指令。该函数需求 ffmpeg 的完整途径和指令行参数,并返回一个 *exec.Cmd 类型的对象。
  8. 通过运用 .StdoutPipe() 和 .Start() 办法来履行 FFmpeg 指令并获取指令输出。
  9. 运用 io.Copy() 函数将转码后的视频文件写入本地文件或上传到云存储服务器。
  10. 运用GORM将上传视频文件的信息存储到数据库中。

一、本地IO

以下是一个代码示例,完结从本地来,到本地去的功用,记住改途径和称号!

package main
import (
	"fmt"
	"os/exec"
)
func main() {
	// 设置视频源文件途径
	inputFile := "input.mp4"
	// 设置转码后文件途径
	outputFile := "output.mp4"
	// 设置 ffmpeg 指令行参数
	args := []string{"-i", inputFile, "-c", "copy", outputFile}
	// 创立 *exec.Cmd
	cmd := exec.Command("ffmpeg", args...)
	// 运转 ffmpeg 指令
	if err := cmd.Run(); err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("转码成功")
}

假如你没有报错的话,能够看到,有输出文件,可是这一来一回有什么用呢?

事实上目的便是让这个转码后的视频文件是能够在线播放的。


二、保存到数据库

光从本地来到本地去总是不持久的,咱们要翻开数据库的大门;

首要需求准备好数据库和表,这儿咱们同样运用Navicat来操作,具体操作过程如下,不需求的能够跳过:

新建衔接 -> MySQL -> 衔接名随意 -> 暗码随意(强烈建议与数据库暗码相同否则或许会发生一些过错) -> 双击左侧翻开 -> 右键information_schema -> 新建数据库 -> 称号随意 -> 字符集utf8mb4

然后履行如下代码即可,留意修改你的途径、称号、数据库称号等信息

package main
import (
	"fmt"
	"os/exec"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)
// 定义 Video struct,用来存储视频信息
type Video struct {
	gorm.Model
	Name string
	Path string
}
func main() {
	// 衔接数据库
	db, err := gorm.Open("mysql", "root:password@/database?charset=utf8&parseTime=True&loc=Local")
	if err != nil {
		panic("failed to connect to the database")
	}
	defer db.Close()
	// 创立表
	db.AutoMigrate(&Video{})
	// FFmpeg指令转换视频
	cmd := exec.Command("ffmpeg", "-i", "input.mp4", "-vcodec", "libx264", "-acodec", "aac", "-strict", "-2", "output.mp4")
	err = cmd.Run()
	if err != nil {
		fmt.Println(err)
	}
	// 在数据库里存储视频信息
	video := Video{Name: "output", Path: "output.mp4"}
	db.Create(&video)
}

Navicat中效果如下:

Go + FFmpeg交互丨学习记录

几点阐明:

  • 这个 ffmpeg 示例中的指令是将视频 “input.mp4” 转换为新的视频文件 “output.mp4″。
  • 在这个指令中,咱们运用了 “-i” 参数来指定输入文件,”-vcodec” 和 “-acodec” 参数来指定视频和音频编码,”-strict” 和 “-2” 参数来指定编码规范。
  • 其中 “-vcodec” 指定了视频编码为 libx264,”-acodec” 指定音频编码为 aac ,这两个编码是在线播放视频常用的编码办法,所以这个转码后的视频文件是能够在线播放的。
  • 假如你想要转换成其它格式,能够查询ffmpeg的文档和参数来完结。

三、前端完结与用户交互

思路一:Nginx

Nginx 的作用是作为一个反向代理服务器,用于将用户的恳求转发到后端服务器进行处理。

反向代理服务器能够帮助完结负载均衡、安全性、缓存等功用。

假如想运用 Nginx 作为 Web 服务器来处理用户的恳求并将其转发到后端服务器,能够这样做:

  1. 首要,需求在自己的服务器上装置 Nginx。
  2. 然后,需求编写 Nginx 的装备文件来处理用户的恳求。举个例子,假如想将一切的 /upload 恳求转发到后端服务器的 /upload 接口,能够在 Nginx 的装备文件中增加如下代码:
location /upload {
    proxy_pass http://backend_server:8000/upload;
}
  1. 在后端服务器上完结对 /upload 接口的处理,如接纳视频文件并进行转码。能够运用 Gin 或其他结构来完结这个功用,并将转码后的文件存储到数据库中。
  2. 完结以上过程后,当用户在前端网页上上传视频文件时,这个文件会被发送到 Nginx,然后 Nginx 会将恳求转发到后端服务器进行处理。后端服务器接纳到恳求后会调用 ffmpeg 将视频转码并存储在数据库中。

假如是在web端指定本地要作为输入的视频途径,这部分需求在前端进行完结,能够在前端页面上运用 HTML input 标签来完结文件挑选功用,并在挑选文件后运用 JavaScript 来获取文件途径并发送到后端服务器。

例如,在 HTML 中运用 input 标签来完结文件挑选功用:

<input type="file" id="input-file">

运用 JavaScript 代码来获取文件途径并发送到后端服务器:

<script>
    var input = document.getElementById("input-file");
    input.addEventListener("change", function() {
        var file = input.files[0];
        var formData = new FormData();
        formData.append("file", file);
        // send the formData to backend server
    });
</script>

思路二:GoFTP

运用 GoFTP 来上传和下载视频,能够在 Go 中运用第三方库:github.com/jlaffaye/ft… ;

运用这个库能够在 Go 中完结 FTP 协议的上传和下载功用,并能够轻松地将视频文件上传到服务器并在服务器上进行转码。如此,能够将文件上传和转码的功用放在同一个服务器上,而不需求运用反向代理服务器来转发恳求。

运用 GoFTP 来上传和下载视频文件的话不需求运用 HTML 和 JavaScript 。能够运用 Go 程序来直接与 FTP 服务器进行交互。能够运用 GoFTP 库,在 Go 中编写程序来衔接到 FTP 服务器完结:衔接到FTP服务器,登录,上传文件,下载文件等操作。

当然,假如需求在web上获取用户挑选的视频文件途径,能够运用HTML和JavaScript来完结这部分功用,可是FTP上传和下载操作能够直接在Go程序中完结。

以下是一个示例代码

package main
import (
	"fmt"
	"os"
	"github.com/jlaffaye/ftp"
)
func main() {
	// 衔接到 FTP 服务器
	conn, err := ftp.Connect("ftp.example.com:21")
	// ftp.example.com:21是一个模拟的FTP服务器地址,实际运用中需求替换成真实的FTP服务器的地址。
	if err != nil {
		fmt.Println("Error connecting to FTP server:", err)
		return
	}
	defer conn.Quit()
	// 登录到 FTP 服务器
	// 需求提早设置好username and password
	if err := conn.Login("username", "password"); err != nil {
		fmt.Println("Error logging in to FTP server:", err)
		return
	}
	// 翻开本地文件
	file, err := os.Open("example.txt")
	if err != nil {
		fmt.Println("Error opening local file:", err)
		return
	}
	defer file.Close()
	// 上传文件到 FTP 服务器
	if err := conn.Stor("example.txt", file); err != nil {
		fmt.Println("Error uploading file:", err)
		return
	}
	fmt.Println("File uploaded successfully!!!")
}

一个新的问题呈现了,怎样建立一个本地测验用的服务器呢?好问题,如下:

在本地建立一个测验用的FTP服务器能够运用一些常用的FTP服务器软件来完结,如FileZilla Server, ProFTPD等。

  • 对于windows体系,能够运用FileZilla Server,下载地址:filezilla-project.org/download.ph… 下载完结后装置,装备好FTP用户名和暗码,设置好拜访权限,就能够在本地测验运用了。
  • 对于Linux体系,能够运用ProFTPD, 装置办法能够运用apt-get,yum等装置工具,装备好FTP用户名和暗码,设置好拜访权限,就能够在本地测验运用了。

三个留意

  • 首席需求留意的是,在装置和装备FTP服务器的过程中,需求遵从安全原则,如设置强暗码,限制拜访权限等,以防止未经授权的拜访。
  • 其次还需求留意的是,在运用FTP服务器时需求留意防火墙设置,保证FTP服务器能够正常拜访。
  • 最终需求留意的是,假如您运用的是公网IP地址,需求留意安全性,由于您的FTP服务器或许会被歹意攻击。

两种办法的比照:

运用 Nginx 作为反向代理服务器和运用 GoFTP 上传和下载视频文件,两种办法有一些不同的优缺陷。

运用 Nginx 作为反向代理服务器的优点:

  • 能够进步体系的安全性,由于 Nginx 能够对用户的恳求进行验证和过滤。
  • 能够完结负载均衡,能够进步体系的可用性和稳定性。
  • 能够完结缓存功用,能够进步体系的性能。

运用 Nginx 作为反向代理服务器的缺陷:

  • 或许会增加体系的复杂度。
  • 或许会增加体系的运维本钱。

运用 GoFTP 上传和下载视频文件的优点:

  • 不需求运用额定的服务器或结构,能够简化体系的架构。
  • 能够直接在 Go 程序中完结文件上传和下载功用。

运用 GoFTP 上传和下载视频文件的缺陷:

  • 或许没有Nginx那么高的安全性,负载均衡和缓存功用。
  • 或许需求自己手动完结文件上传和下载的功用,运维本钱或许更高。

总结来说,对于需求高安全性,高并发,高可用性的体系,运用 Nginx 作为反向代理服务器或许会更好。可是假如你的体系不需求如此高级的功用,而且希望简化体系架构,减少运维本钱,运用 GoFTP 来上传和下载视频文件或许是一个更好的挑选。


两种办法的结合:

当然,这两种办法是能够结合起来运用的。

  • 运用 Nginx 作为反向代理服务器,来过滤和验证用户的恳求,并将恳求转发到 Go 程序中进行处理。

  • 在 Go 程序中能够运用 GoFTP 上传和下载视频文件,并在文件上传完结后运用 ffmpeg 进行转码,将转码后的文件保存到数据库。

这样做的好处是,Nginx 能够提供高安全性、高并发、高可用性等功用,而 GoFTP 能够提供简化体系架构、减少运维本钱等功用,坏处很显然,便是完结费事。


四、FileZillaServer + X-Plore

这儿介绍一种基于上文思路二,运用FileZillaServer + X-Plore完结的局域网下不同设备之间的文件互传办法;

FileZillaServer

是什么

是能在本地建立一个测验用的FTP服务器的软件。

怎样下载怎样用

下载地址:FileZilla中文网 – 免费开源的FTP解决方案

前面的装置以及初始化过程能够参阅:

FileZilla建立FTP服务器图解教程 – 知乎 (zhihu.com)

记住第一个要设置为根目录;

完结设置之后在本地的资源管理器中(以前是能够用浏览器的)输入ftp://127.0.0.1进入即可。

然后就能够看到该用户能够看到的文件列表了。

这个时分能够为该用户增加新的可见的非根目录的文件夹,而且需求人为地指定它在服务器端的途径,例如/myAdditional,随后确认后刷新页面,就能够发现多了一个文件夹,这样就能够做到本地的文件结构和服务器端的不一样。

有趣的是,这一操作能够让咱们重新组织本地文件体系下的各个途径。

还有咱们能够运用一个比较便利的可视化的客户端来操作:FileZilla-Client;

由于操作比较简单这儿就不给出介绍了,下载地址同上。


Android拜访FTP服务器

可供运用的APP有:

  • AndFTP
  • 蚂蚁科技
  • Turbo FTP 客户端
  • ES 文件资源管理器
  • 简易 FTP 客户端
  • 管理员之手应用程序
  • Termius – SSH / SFTP
  • FTP 服务器
  • X-Plore

笔者的挑选是X-Plore,十分好用;

下载之后点击FTP,然后输入刚才在PC端设置的IP(便是cmd中ipconfig的ipv4那个)以及账户+暗码,就能够衔接到FTP服务器了。

这个时分咱们再运转思路二中的示例代码,记住写好要传输的文件,运转即可完结文件互传,十分便利。