Go + FFmpeg交互丨学习记录

这篇具有很好参考价值的文章主要介绍了Go + FFmpeg交互丨学习记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、前言

注:本文未完待续

主要思路:

使用 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将上传视频文件的信息存储到数据库中。

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)
}

Navicat中效果如下:

go调用ffmpeg,音视频开发,程序员,编程,ffmpeg,golang,webrtc,音视频,RTMP

几点说明:

  • 这个 ffmpeg 示例中的命令是将视频 "input.mp4" 转换为新的视频文件 "output.mp4"。

  • 在这个命令中,我们使用了 "-i" 参数来指定输入文件,"-vcodec" 和 "-acodec" 参数来指定视频和音频编码,"-strict" 和 "-2" 参数来指定编码标准。

  • 其中 "-vcodec" 指定了视频编码为 libx264,"-acodec" 指定音频编码为 aac ,这两个编码是在线播放视频常用的编码方式,所以这个转码后的视频文件是可以在线播放的。

  • 如果你想要转换成其它格式,可以查询ffmpeg的文档和参数来实现。

4、前端实现与用户交互

4.1 思路一: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>

【学习地址】:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发

【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~

go调用ffmpeg,音视频开发,程序员,编程,ffmpeg,golang,webrtc,音视频,RTMP

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服务器能够正常访问。

  • 最后需要注意的是,如果您使用的是公网IP地址,需要注意安全性,因为您的FTP服务器可能会被恶意攻击。

4.3 两种方法的对比:

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

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

  • 可以提高系统的安全性,因为 Nginx 可以对用户的请求进行验证和过滤。

  • 可以实现负载均衡,可以提高系统的可用性和稳定性。

  • 可以实现缓存功能,可以提高系统的性能。

使用 Nginx 作为反向代理服务器的缺点:

  • 可能会增加系统的复杂度。

  • 可能会增加系统的运维成本。

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

  • 不需要使用额外的服务器或框架,可以简化系统的架构。

  • 可以直接在 Go 程序中实现文件上传和下载功能。

使用 GoFTP 上传和下载视频文件的缺点:

  • 可能没有Nginx那么高的安全性,负载均衡和缓存功能。

  • 可能需要自己手动实现文件上传和下载的功能,运维成本可能更高。

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

4.4 两种方法的结合:

当然,这两种方法是可以结合起来使用的。

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

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

这样做的好处是,Nginx 可以提供高安全性、高并发、高可用性等功能,而 GoFTP 可以提供简化系统架构、减少运维成本等功能,坏处很显然,就是实现麻烦。

5、FileZillaServer + X-Plore

这里介绍一种基于上文思路二,使用FileZillaServer + X-Plore实现的局域网下不同设备之间的文件互传方法;

5.1 FileZillaServer

是什么

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

怎么下载怎么用

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

前面的安装以及初始化步骤可以参考:

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

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

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

然后就可以看到该用户可以看到的文件列表了。

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

有趣的是,这一操作可以让我们重新组织本地文件系统下的各个路径。

还有我们可以使用一个比较方便的可视化的客户端来操作:FileZilla-Client;

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

5.2 Android访问FTP服务器

可供使用的APP有:

  • AndFTP

  • 蚂蚁科技

  • Turbo FTP 客户端

  • ES 文件资源管理器

  • 简易 FTP 客户端

  • 管理员之手应用程序

  • Termius - SSH / SFTP

  • FTP 服务器

  • X-Plore

笔者的选择是X-Plore,非常好用;

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

这个时候我们再运行思路二中的示例代码,记得写好要传输的文件,运行即可实现文件互传,非常方便。

原文链接:Go + FFmpeg交互丨学习记录 - 掘金文章来源地址https://www.toymoban.com/news/detail-741394.html

到了这里,关于Go + FFmpeg交互丨学习记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GO语言日志切割 + 记录调用源

    日志记录对程序排查问题比较关键,记录下GO中日志选择,从以下出发点考虑: 日志文件能自动切割,以免过大 能记录从哪个文件哪行代码调用的,方便排查问题 配置简单明了 库文件使用人数较多,稳定 经过一段时间摸索,最终选择了 Logrus 和 lumberjack 两个库,使用人数都

    2024年02月15日
    浏览(38)
  • ffmpeg学习记录

    1、对图片进行裁剪 ffmpeg -i input.jpg -vf crop=iw/3:ih:20:0 caijian.jpg PS: crop=100:100:12:34 相同效果: crop=w=100:h=100:x=12:y=34 2、视频增加文字水印 使用 drawtext 滤镜进行增加水印 参数 类型 说明 text 字符串 文字 textfile 字符串 文字文件 box 布尔 文字区域背景框(缺省false) boxcolor 色彩 展示字

    2024年02月09日
    浏览(41)
  • 2023-05-04:用go语言重写ffmpeg的scaling_video.c示例,用于实现视频缩放(Scaling)功能。

    2023-05-04:用go语言重写ffmpeg的scaling_video.c示例,用于实现视频缩放(Scaling)功能。 答案2023-05-04: 这段代码实现了使用 libswscale 库进行视频缩放的功能。下面是程序的主要流程: 1.获取命令行参数,包括输出文件名和目标图像大小。 2.解析目标图像大小,生成指定大小的输出

    2024年02月02日
    浏览(40)
  • 2023-04-30:用go语言重写ffmpeg的resampling_audio.c示例,它实现了音频重采样的功能。

    2023-04-30:用go语言重写ffmpeg的resampling_audio.c示例,它实现了音频重采样的功能。 答案2023-04-30: resampling_audio.c 是 FFmpeg 中的一个源文件,其主要功能是实现音频重采样。 音频重采样是指将一段音频数据从一个采样率、声道数或样本格式转换为另一种采样率、声道数或样本格式

    2024年02月02日
    浏览(37)
  • 【FFmpeg】ffmpeg 命令行参数 ⑤ ( 使用 ffmpeg 命令提取 音视频 数据 | 保留封装格式 | 保留编码格式 | 重新编码 )

    使用 ffmpeg 命令 从 视频数据 中 提取 音频数据 / 视频数据 保留封装格式 , 封装格式 指的就是 封装 视频数据 的 容器 ; 一个 mp4 格式的视频 , 其 封装容器 就是 mp4 容器 , 其中 封装了 h.264 格式的视频数据 和 aac 格式的 音频数据 ; 执行 命令 , 从 input.mp4 输入文件中 , 提取 音频

    2024年03月23日
    浏览(59)
  • 基于新版FFmpeg(FFmpeg 6.1)的音视频复用(不涉及编解码)

    FFmpeg库常用函数介绍(一)-CSDN博客 FFmpeg库常用函数介绍(二)-CSDN博客 FFmpeg库常用函数介绍(三)-CSDN博客 这篇文章介绍的是基于新版FFmpeg(FFmpeg 6.1)的音视频复用器的实现,可以实现音频和视频文件复用为一个视频文件,具体功能如下表所示。 输入视频文件 输入音频文

    2024年01月17日
    浏览(74)
  • 【FFmpeg】音视频录制 ① ( 查询系统中 ffmpeg 可录制的音视频输入设备 | 使用 ffmpeg 命令录制音视频数据 | 录制视频数据命令 |录制音频数据| 同时录制音频和视频数据命令 )

    在 Windows 系统中 , 使用 ffmpeg 命令 录制 音视频 , 需要先获取 系统的 音视频设备 信息 , 录制 音视频 本质上是从 系统音视频设备 中获取数据 ; 执行 命令 , 可以获取 系统中 ffmpeg 可用的 DirectShow 音视频输入设备 ; 命令参数解析 : -list_devices true : 列出所有 ffmpeg 的 指定类型的可

    2024年04月25日
    浏览(92)
  • 音视频 ffmpeg视频裁剪

    将输入视频帧的宽度和高度从x和y值表示的位置裁剪到指定的宽度和高度;x和y是输出的左上角坐标,协调系统的中心是输入视频帧的左上角。 如果使用了可选的keep_aspect参数,将会改变输出SAR(样本宽比)以补偿新的DAR(显示长宽比) 推荐一个零声学院项目课,个人觉得老师讲得不

    2024年02月10日
    浏览(52)
  • 【FFmpeg】ffmpeg 命令行参数 ⑧ ( 使用 ffmpeg 转换封装格式 | 音视频编解码器参数设置 | 视频 帧率 / 码率 / 分辨率 设置 | 音频 码率 / 采样率 设置 )

    音视频 文件 从 采样 - 处理 - 得到原始数据帧队列 - 音视频编码 - 音视频包队列 - 格式封装 的过程如下 : 封装格式 参考 【音视频原理】音视频 “ 采样 - 编码 - 封装 过程 “ 和 “ 解封装 - 解码 - 播放 过程 “ 分析 ( 视频采集处理流程 | 音频采集处理流程 | 音视频文件解封装

    2024年04月17日
    浏览(85)
  • [一]ffmpeg音视频解码

    (1)下载FFmpeg源码(v3.3.6) 下载地址( http://www.ffmpeg.org/download.html#releases ) (2)下载NDK(r14b) 下载地址( https://developer.android.google.cn/ndk/downloads/index.html) (3)编写Android编译脚本 (1)用ftp上传到Ubuntu中 (2)解压Ffmpeg(tar -zxvf ffmpeg-3.3.6.tar.gz) (3)解压NDK(unzip andro

    2024年01月19日
    浏览(273)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包