Golang调用FFmpeg转换视频流的实现

作者:Edward.W 时间:2024-04-30 10:01:43 

问题背景

问题背景是在,由于视频采集端使用的是H264编码采集的裸流,而网络流媒体大多是以FLV为主的直播方式进行的,为了实现实时直播,当前是打算直接使用FFmpeg将H264裸流实时转成FLV视频流。

为什么是使用FLV视频流呢,因为相对简单,加上FLV Header后将每个NALU打包成Tag并进去大致就行了。但是这块怕有疏忽,最终还是想使用成熟的工具FFmpeg。

方法实现

1. 使用FFmpeg-go封装好的方法

FFmpeg-go

上面有具体的Demo,但是只有流转文件,也只有文件转流的方法,对于流转流还是需要自己动手处理一下。

import ffmpeg "github.com/u2takey/ffmpeg-go"
 
err := ffmpeg.Input("pipe:", ffmpeg.KwArgs{
        "format":     "rawvideo",
        "video_size": fmt.Sprintf("%dx%d", 480, 1064)}).WithInput(filein).
        Output("pipe:",
            ffmpeg.KwArgs{"c:v": "libx264", "f": "flv", "crf": "24"}).
        WithOutput(buf, errorbuf).
        Run()
if err != nil {
        panic(err)
}
bufs := make([]byte, 1024)
out, _ := os.OpenFile("res2.flv", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0644)
for {
    n, err := buf.Read(bufs)
    if n == 0 || err == io.EOF {
        out.Close()
        break
    } else {
        //此处处理输出流,这边简单地写到文件里
        out.Write(bufs)
    }
}

其中

filein   是输入的H264视频裸流   buf是输出的视频流
虽说代码是这么写,但是实际上是run不起来的,不清楚具体是什么原因,因此后续还是打算直接调用ffmpeg可执行程序。

2. 直接调用FFmpeg

首先需要在电脑上下载好ffmpeg并且添加到环境变量,保证执行Powshell或者cmd指令的ffmpeg时能够正常运行,接下来还是直接上代码。

cmd := exec.Command("ffmpeg", "-re", "-r", "30", "-i", "pipe:0", "-vcodec", "libx264", "-f", "flv", "pipe:1", "-y", "another.flv")

//获取输入流
stdin, err := cmd.StdinPipe()
if err != nil {
   fmt.Println("Error getting stdout pipe:", err)
   return
}

//要写东西进去的时候只需要
stdin.Write(bytes)

//获取输出流
stdout, err := cmd.StdoutPipe()
if err != nil {
   fmt.Println("Error getting stdout pipe:", err)
   return
}

// Start the command
err = cmd.Start()
if err != nil {
   fmt.Println("Error starting command:", err)
   return
}

这边需要注意到的点是,如果不加上"-re"的话,需要等stdin.close()之后,整个ffmpeg才会运行,才能见到有输出流。

其次,这边加了 “-y” "another.flv",是用来进行对比的,这里ffmpeg将会把输出同时放在两个地方,一个写入到文件another.flv里(-y 是覆盖原有文件),另一个通过stdout传出来,我将stdout的数据流保存成out.flv后发现同another.flv对比发现并不相同。或许视频流和文件不应该这么处理。

来源:https://blog.csdn.net/u013379032/article/details/129157928

标签:Golang,FFmpeg,视频流
0
投稿

猜你喜欢

  • 2014 年最热门的21款JavaScript框架推荐

    2024-04-16 08:48:08
  • python开发游戏的前期准备

    2022-01-06 12:58:01
  • Dreamweaver4使用技巧之--为你的站点定做颜色

    2010-09-05 21:12:00
  • 使用Python爬取弹出窗口信息的实例

    2021-08-27 19:11:25
  • Javascript 每日测试 - 第五期 callee及function

    2008-07-10 13:22:00
  • SQL Server中的逻辑函数介绍

    2024-01-20 06:20:37
  • Python实现的桶排序算法示例

    2021-01-04 09:09:14
  • JavaScript高级程序设计 读书笔记之十 本地对象Date日期

    2024-04-22 22:33:48
  • 浅谈Python接口对json串的处理方法

    2022-07-30 13:03:49
  • JS关于刷新页面的相关总结

    2024-04-22 12:52:36
  • Python实现带图形界面的炸金花游戏(升级版)

    2023-06-27 08:35:20
  • mint-ui在vue中的使用示例

    2023-07-02 16:52:17
  • MySQL学习笔记4:完整性约束限制字段

    2024-01-27 15:54:29
  • MySql 缓存查询原理与缓存监控和索引监控介绍

    2024-01-29 07:30:15
  • Python+OpenCV图像处理——图像二值化的实现

    2021-05-15 04:39:03
  • Python-嵌套列表list的全面解析

    2022-11-08 23:33:08
  • pandas调整列的顺序以及添加列的实现

    2022-09-21 12:31:10
  • Python 批量刷博客园访问量脚本过程解析

    2023-11-23 21:30:14
  • Python Pandas中缺失值NaN的判断,删除及替换

    2021-08-27 22:10:23
  • 详解Python中的三元运算

    2021-02-22 12:27:26
  • asp之家 网络编程 m.aspxhome.com