Golang调用FFmpeg转换视频流

2023-05-16

问题背景

        问题背景是在,由于视频采集端使用的是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对比发现并不相同。或许视频流和文件不应该这么处理。

总结

建议直接调用FFmpeg的可执行文件进行操作最好。

但是这样实时的流转流的方式实际上还是有挺大延迟的,如果要实时视频流P2P模式建议要么在采集端处理好要么在播放端处理好,中间层就不要过多操作影响实时性,如果是推流拉流的模式还是建议在中间层处理好。

存在问题

这边还是发现一些问题的,尤其是直接使用ffmpeg的时候

1. 直接读取文件和读取文件通过stdin传入byte获取到的结果是不一致的。

2. 直接output成文件和通过stdout获取byte再保存成文件得到的结果也是不一致的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Golang调用FFmpeg转换视频流 的相关文章

  • H264 字节流到图像文件

    第一次来这里所以要温柔 我已经在给定的 H 264 字节流上工作了几个星期 一般注意事项 字节流不是来自文件 它是从外部源实时提供给我的 字节流使用 Android 的媒体编解码器进行编码 当将流写入扩展名为 H264的文件时 VLC能够正
  • 使用 Ffmpeg 编辑视频元数据

    我想更改视频元数据 原始视频信息 ffmpeg i video mp4 Metadata major brand mp42 minor version 0 compatible brands isomavc1mp42 creation ti
  • 适用于 iPhone 和 HTTP 直播的实时视频聊天

    所以一般来说 我想为 iPhone 制作一个具有视频聊天功能的应用程序 但经过多次搜索 我仍然找不到任何成功的结果 是否有任何公共或私有 API 可用于在 iPhone 上执行此操作 如果您的答案是 是 请帮助我 基本上 我想要的是读取连接
  • FFmpeg - 来自 NodeJS 的 RTMP 流,流比实时更快

    我的目标是在 Node 中渲染画布 并将该画布流式传输到 RTMP 服务器 最终是 Twitch 但现在我正在在本地 RTMP 服务器上测试 流式传输到 RTMP 的标准方式似乎是ffmpeg 所以我使用它 从 NodeJS 中作为子进程生
  • 从 ffmpeg 获取实时输出以在进度条中使用(PyQt4,stdout)

    我已经查看了很多问题 但仍然无法完全弄清楚 我正在使用 PyQt 并且希望能够运行ffmpeg i file mp4 file avi并获取流式输出 以便我可以创建进度条 我看过这些问题 ffmpeg可以显示进度条吗 https stack
  • 使用FFMpeg确定视频类型,然后进行转换?

    我正在尝试以编程方式确定文件的真实类型 看来我必须使用 FFMPeg 来实现这一点 我想确定上传的文件实际上是否是 MP4 或 FLV 对于 Flash 视频 或 WebM 对于 HTML5 我知道 FFMPeg 中的 i 运算符 但我不知
  • Bash 脚本:自动为 mpeg-dash 进行 ffmpeg 编码

    我正在编写一个 bash 文件来创建视频编码和串联 以供 dash 实时流媒体使用 基本上 它读取输入视频文件夹 将所有视频编码为三种分辨率格式 然后将它们连接起来创建三个适应集 DIAGRAM 该脚本检查 fps 一致性 如果输入不是 1
  • 使用 Coldfusion 的 CFFILE 标签监控 FFMpeg 的进度日志

    我想学习如何使用 ColdFusion 中的 CFFILE 标签来读取文本文件的内容 就我而言 该文本文件是 FFMpeg 在对媒体文件进行转码时生成的进度日志 我想编写一个 ColdFusion 脚本 该脚本将定期轮询进度日志 直到日志表
  • FFMPEG波形透明,背景纯色

    我正在尝试使用 ffmpeg 生成波形 我希望背景为纯色 实际波形为透明 以下部分实现了我想要的 除了有黑色背景 我希望能够将其更改为任何颜色 但波形是透明的 我怎样才能用 ffmepg 实现这个目标 ffmpeg i input mp3
  • 如何在服务器上使用 ffmpeg 从 WebRTC 流获取音频和视频

    我正在尝试从 WebRTC 流获取音频和视频 并在 ubuntu 服务器上使用 ffmpeg 处理它 转码或转储 我天真地期望它能简单地解释 WebRTC 提供的 sdp 但我错了 我怀疑 ffmpeg 无法发回答案 sdp 必须手动完成
  • 将 ffmpeg 编译为独立二进制文件

    我正在尝试编译ffmpeg作为独立的二进制文件 因为我想在 AWS lambda 中使用它 我可以让事情在我正在编译的服务器上正常工作 但是如果我复制二进制文件并从另一台服务器运行它 我会得到 ffmpeg error while load
  • Python FFmpeg查询rtsp太慢

    目前 我正在尝试使用 python 和 FFmpeg 来查询原始格式为 h264 的 rtsp 数据 直播流视频的信息为 fps 29 分辨率 1280 720 我希望我可以以相同的格式 h264 查询数据并将其放入python队列中以便将
  • 如何使用 ffmpeg av_seek_frame() 在具有帧号的情况下读取任何帧

    int64 t timeBase timeBase int64 t pavStrm gt time base num AV TIME BASE int64 t pavStrm gt time base den int64 t seekTar
  • 如何从 ffmpeg 中打开的文件获取流信息?

    我正在尝试使用 ffmpeg 读取视频文件 我有与其旧版本相对应的工作代码 并开始尝试升级到最新的构建版本 将所有这些已弃用的函数替换为其实际的类似函数 但是我遇到了问题 似乎没有检索到任何流 并且视频负载停止在轨道中 这是我正在使用的代码
  • PowerShell 脚本 ffmpeg

    作为一名优秀的 Windows 系统管理员 我终于开始学习 PowerShell 话虽这么说 我不知道我在做什么 惊讶 惊讶 我认为远离生产环境 在家里使用 PowerShell 对我来说将是一次很好的学习经历 最近 我开始使用 FFMPE
  • 有没有更有效的方法通过ffmpeg批量添加水印和加入视频?

    我有这个批处理文件 使用 ffmpeg 在我的视频中添加徽标 然后添加简介 但需要 10 小时到一天的时间 具体取决于我需要添加水印的数量 是否有更有效的方法来实现此目的 视频有时具有不同的分辨率 因此我无法删除到 1280 720 尺寸的
  • 如何在不指定像素格式的情况下从 AVFrame.data[] 和 AVFrame.linesize[] 获取原始帧数据?

    我的总体想法是frame data 根据视频的像素格式 RGB 或 YUV 进行解释 但是有没有通用的方法可以从帧中获取所有像素数据 我只想计算帧数据的哈希值 而不解释它来显示图像 根据 AVFrame h uint8 t AVFrame
  • 如何将ffmpeg中的ataenoise迁移到我自己的项目中?

    这是 ataenoise 滤波器的入口 libavfilter vf ataenoise c static int filter slice AVFilterContext ctx void arg int jobnr int nb job
  • 输入文件列表以与 Node.js 模块 Fluent-ffmpeg 连接

    版本信息 流利的 ffmpeg 版本 2 1 2 ffmpeg版本 3 4 2 操作系统 Windows 10 要重现的代码 ffmpeg C path to list txt mergeToFile C path to out mp4 C
  • 将yuv420p原始数据转换为opencv图像

    我有来自 rtmp 服务器的原始数据 像素格式为 yuv420p 我使用管道来读取数据 但我不知道如何将原始数据解码为图像 command ffmpeg command extend loglevel fatal i rtmp localh

随机推荐

  • 大语言模型的涌现能力:现象与解释

    注1 本文整理自我在今年3 月 11 日 中国人工智能学会 主办的 ChatGPT 及大模型专题研讨会 上 大型语言模型的涌现能力 现象与解释 的现场分享 介绍了大语言模型中的涌现现象 以及关于涌现能力背后原因的相关猜想 感谢CSDN帮助整
  • 大模型、知识图谱之间的关系

    作者 AI未来科技 链接 https www zhihu com question 590846667 answer 2954840595 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 nbsp 大模型 如
  • 大模型“涌现”的思维链,究竟是一种什么能力?

    所谓 涌现 在大模型领域指的是当模型突破某个规模时 xff0c 性能显著提升 xff0c 表现出让人惊艳 意想不到的能力 比如语言理解能力 生成能力 逻辑推理能力等 一般来说 xff0c 模型在100亿到1000亿参数区间 xff0c 可能
  • android 使用kotlin 获取设备id

    在 Android 中 xff0c 获取设备的唯一标识符是一项常见的任务 以下是使用 Kotlin 语言获取设备 ID 的步骤 xff1a 1 在 AndroidManifest xml 文件中添加以下权限 xff1a lt uses pe
  • ubuntu apache2 php 中文乱码

    今天在ubuntu 14 下配置apache2 发现解析 php文件的时候中文会出现乱码 xff0c 于是检查了一下 php ini的配置 xff0c 发现 default charset 61 UTF 8 这项没有打开 xff0c 于是把
  • 16-CoreData之多表关联(存储自定义数据模型)

    多表关联 1 1 简介 什么是多表关联 在处理数据库的关系中 xff0c 无非只有三种关系一对一 xff1a 一个老师只能在一个教室上课 xff0c 不可能同时在两个教室上课一对多 xff1a 一个教室可以有多个学生 xff0c 但一个学生
  • Redis的基础

    Redis 文章目录 Redis基础和memcache的区别为什么单线程能有很高的效率具体原因连接过程一次连接流程多个socket xff0c io多路复用程序 xff0c 消息队列 xff0c 文件事件分派器 xff0c 事件处理器 命令
  • python 查询windows的cpu、内存使用率

    coding UTF 8 import os def get info metric metric cmd map 61 34 cpu usage rate 34 34 wmic cpu get loadpercentage 34 34 m
  • 安装GitLab及简单使用

    系统 xff1a CentOS 7 3x64 配置gitlab源 到 etc yum repos d目录下新建gitlab ce repo文件 xff0c gitlab ce name 61 gitlab ce baseurl 61 htt
  • iOS UIBezierPath 通过贝塞尔曲线画圆环 创建一个环形进度指示器

    一 先简单了解一下通过贝塞尔曲线画一个圆的基本概念 xff0c 坐标系请参考下图 要画一个贝塞尔曲线要有几个基本的要素 起始角度 结束角度 半径 是否按照顺时针方向 贝塞尔曲线只是规划了一个Layer的路径 xff0c 而不能真正的展示出来
  • VMware虚拟机安装Ubuntu22.04并配置网络

    一 Ubuntu22 04下载 地址 xff1a https ubuntu com Ubuntu Desktop 包含图形用户界面 Ubuntu Server 不包含图形用户界面 二 VMware安装Ubuntu22 04 三 配置网络 设
  • error RC2108: expected numerical dialog constant

    在我们用图形控件Picture Control在对话框上添加图片是 xff0c 经常会出现error RC2108 expected numerical dialog constant 解决方法 xff1a 双击error rc2018 打
  • uos服务器系统安装PVE

    文章目录 一 PVE介绍 二 系统和组件版本 三 部署pve 1 修改主机名 2 pve安装 3 浏览器访问 一 PVE介绍 Proxmox VE Proxmox Virtual Environment 有方便易用的WEB界面 基于JAVA
  • 通过设置JDK解决存在多个Gradle后台进程的问题

    使用Android Studio经常会在Event Log窗口遇到如下报错 xff1a 简单解释下就是如果后台有一个常驻的gradle守护进程 xff0c 可以提高我们构建效率 因为这样不但可以避免每次都重新启动JVM xff0c 并且可以
  • intellij idea关闭vim模式

    tools gt vim emulator
  • 最大似然估计和最小二乘估计的区别与联系

    看似最小二乘估计与最大似然估计在推导得到的结果很相似 xff0c 但是其前提条件必须引起大家的注意 xff01 xff01 xff01 对于最小二乘估计 xff0c 最合理的参数估计量应该使得模型能最好地拟合样本数据 xff0c 也就是估计
  • 关于Web API 2.0中的Options请求返回405的问题

    关于Web API 2 0中的Options请求返回405的问题 前提 xff1a IIS寄宿的网站 当你向服务器发送非简单请求时 xff0c 客户端会先发送一条预检请求 xff0c 借以确认当前请求源和待请求方法是否被网站允许 xff08
  • 得到指针指向的数组的长度

    1 定义数组 xff0c 要给定其长度 xff0c 也可以用Type a 61 的方式 在对数组进行操作时 xff0c 可能需要计算数组长度 xff0c 方法是 xff1a sizeof 数组名 sizeof 元素类型 数组int a 4
  • Redis的应用--分布式锁

    Redis 文章目录 Redis应用分布式锁解决方案 应用 分布式锁 互斥死锁容错 解决方案 正常使用redis的nx数据 xff0c 下面的语句 xff0c key使用对应的前缀 43 主键 xff0c value使用一个随机值UUID
  • Golang调用FFmpeg转换视频流

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