零、前言
注:本文未完待续
首要思路:
运用 Golang 和 FFmpeg 交互能够分为以下几个过程:
- 装置 FFmpeg: 首要需求装置 FFmpeg,能够在终端中输入指令来装置。
- 创立一个Golang项目,并在其中创立一个接纳上传视频文件的接口。
- 在接口中接纳上传的文件,并运用Golang中的 exec 包来履行 FFmpeg 指令来转码视频。
- 转码后的文件能够保存在本地或上传到云存储服务器。
- 将视频信息存储到 MySQL 数据库中。
- 在Golang中运用GORM或其他ORM库来衔接数据库并存储数据。
- 在代码中运用 exec.Command 函数来履行 FFmpeg 指令。该函数需求 ffmpeg 的完整途径和指令行参数,并返回一个 *exec.Cmd 类型的对象。
- 通过运用 .StdoutPipe() 和 .Start() 办法来履行 FFmpeg 指令并获取指令输出。
- 运用 io.Copy() 函数将转码后的视频文件写入本地文件或上传到云存储服务器。
- 运用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中效果如下:
几点阐明:
- 这个 ffmpeg 示例中的指令是将视频 “input.mp4” 转换为新的视频文件 “output.mp4″。
- 在这个指令中,咱们运用了 “-i” 参数来指定输入文件,”-vcodec” 和 “-acodec” 参数来指定视频和音频编码,”-strict” 和 “-2” 参数来指定编码规范。
- 其中 “-vcodec” 指定了视频编码为 libx264,”-acodec” 指定音频编码为 aac ,这两个编码是在线播放视频常用的编码办法,所以这个转码后的视频文件是能够在线播放的。
- 假如你想要转换成其它格式,能够查询ffmpeg的文档和参数来完结。
三、前端完结与用户交互
思路一:Nginx
Nginx 的作用是作为一个反向代理服务器,用于将用户的恳求转发到后端服务器进行处理。
反向代理服务器能够帮助完结负载均衡、安全性、缓存等功用。
假如想运用 Nginx 作为 Web 服务器来处理用户的恳求并将其转发到后端服务器,能够这样做:
- 首要,需求在自己的服务器上装置 Nginx。
- 然后,需求编写 Nginx 的装备文件来处理用户的恳求。举个例子,假如想将一切的 /upload 恳求转发到后端服务器的 /upload 接口,能够在 Nginx 的装备文件中增加如下代码:
location /upload {
proxy_pass http://backend_server:8000/upload;
}
- 在后端服务器上完结对 /upload 接口的处理,如接纳视频文件并进行转码。能够运用 Gin 或其他结构来完结这个功用,并将转码后的文件存储到数据库中。
- 完结以上过程后,当用户在前端网页上上传视频文件时,这个文件会被发送到 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服务器了。
这个时分咱们再运转思路二中的示例代码,记住写好要传输的文件,运转即可完结文件互传,十分便利。