1、前言
注:本文未完待续
主要思路:
2、本地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("转码成功")
}
如果你没有报错的话,可以看到,有输出文件,但是这一来一回有什么用呢?
3、保存到数据库
首先需要准备好数据库和表,这里我们同样使用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)
}
几点说明:
-
在这个命令中,我们使用了 “-i” 参数来指定输入文件,”-vcodec” 和 “-acodec” 参数来指定视频和音频编码,”-strict” 和 “-2” 参数来指定编码标准。
-
其中 “-vcodec” 指定了视频编码为 libx264,”-acodec” 指定音频编码为 aac ,这两个编码是在线播放视频常用的编码方式,所以这个转码后的视频文件是可以在线播放的。
4、前端实现与用户交互
4.1 思路一:Nginx
Nginx 的作用是作为一个反向代理服务器,用于将用户的请求转发到后端服务器进行处理。
如果想使用 Nginx 作为 Web 服务器来处理用户的请求并将其转发到后端服务器,可以这样做:
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>
【学习地址】:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~
4.2 思路二: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服务器能够正常访问。
4.3 两种方法的对比:
使用 Nginx 作为反向代理服务器和使用 GoFTP 上传和下载视频文件,两种方法有一些不同的优缺点。
使用 Nginx 作为反向代理服务器的优点:
使用 Nginx 作为反向代理服务器的缺点:
使用 GoFTP 上传和下载视频文件的优点:
使用 GoFTP 上传和下载视频文件的缺点:
总结来说,对于需要高安全性,高并发,高可用性的系统,使用 Nginx 作为反向代理服务器可能会更好。但是如果你的系统不需要如此高级的功能,并且希望简化系统架构,减少运维成本,使用 GoFTP 来上传和下载视频文件可能是一个更好的选择。
4.4 两种方法的结合:
当然,这两种方法是可以结合起来使用的。
这样做的好处是,Nginx 可以提供高安全性、高并发、高可用性等功能,而 GoFTP 可以提供简化系统架构、减少运维成本等功能,坏处很显然,就是实现麻烦。
5、FileZillaServer + X-Plore
这里介绍一种基于上文思路二,使用FileZillaServer + X-Plore实现的局域网下不同设备之间的文件互传方法;
5.1 FileZillaServer
是什么?
怎么下载怎么用?
下载地址:FileZilla中文网 – 免费开源的FTP解决方案
FileZilla搭建FTP服务器图解教程 – 知乎 (zhihu.com)
完成设置之后在本地的资源管理器中(以前是可以用浏览器的)输入ftp://127.0.0.1
进入即可。
这个时候可以为该用户添加新的可见的非根目录的文件夹,并且需要人为地指定它在服务器端的路径,例如/myAdditional
,随后确定后刷新页面,就可以发现多了一个文件夹,这样就可以做到本地的文件结构和服务器端的不一样。
有趣的是,这一操作可以让我们重新组织本地文件系统下的各个路径。
还有我们可以使用一个比较方便的可视化的客户端来操作:FileZilla-Client;
5.2 Android访问FTP服务器
可供使用的APP有:
下载之后点击FTP,然后输入刚才在PC端设置的IP(就是cmd中ipconfig的ipv4那个)以及账户+密码,就可以连接到FTP服务器了。
这个时候我们再运行思路二中的示例代码,记得写好要传输的文件,运行即可实现文件互传,非常方便。
原文地址:https://blog.csdn.net/irainsa/article/details/129934724
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_28378.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!