FFmpeg实现fmp4+h265 aac切片命令

news2025/1/21 9:29:40

目录

背景

环境

FFmpeg实现fmp4+h265 aac切片命令

使用go创建hls server

使用hls.js demo播放

播放地址:hls.js demo


背景

Chrome在104/105版本后,支持硬解h265,使得hls利用浏览器硬解特性播放h265视频。hls官方要求h265必须使用fmp4格式进行封装,因此本篇使用ffmpeg采集摄像头fmp4+h265 aac切片,并使用hls.js demo在chrome浏览器中播放测试。

环境

操作系统:macos 11.6.1 

浏览器: chrome 107,查看是否支持硬解("h265" | Can I use... Support tables for HTML5, CSS3, etc)

ffmpeg版本:5.1.2,支持libx265

hls.js demo版本:v1.2.7

FFmpeg实现fmp4+h265 aac切片命令

ffmpeg -f avfoundation -video_size 640x480 -framerate 30 -i "0:0" -c:v libx265 -tag:v hvc1 -c:a aac \
-map 0 \
-f hls \
-hls_time 10 \
-hls_flags delete_segments+append_list+split_by_time \
-hls_segment_type fmp4 \
-hls_list_size 10 \
-hls_playlist_type vod \
stream.m3u8

切片后的文件如下:

➜  fmp4-h265 tree
.
├── init.mp4
├── stream.m3u8
├── stream0.m4s
├── stream1.m4s
├── stream2.m4s
├── stream3.m4s
├── stream4.m4s
├── stream5.m4s
└── stream6.m4s

0 directories, 9 files

使用go创建hls server

package main

import (
	"bytes"
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"strings"
	"time"
)

var filePath = "./" //切片路径

func onHLSVod(w http.ResponseWriter, r *http.Request) {
	buf := bytes.NewBuffer(make([]byte, 0, 1024*1024))
	if strings.LastIndex(r.URL.Path, "m3u8") != -1 {
		fmt.Println("request m3u8", r.URL.Path)
		m3u8, err := os.Open(filePath + "stream.m3u8")
		if err != nil {
			return
		}
		defer m3u8.Close()
		b, _ := ioutil.ReadAll(m3u8)
		buf.Write(b)
		w.Header().Add("Content-Type", "application/vnd.apple.mpegurl")
	} else {
		fmt.Println("request fmp4", r.URL.Path)
		fmp4File := strings.TrimLeft(r.URL.Path, "/vod/")
		fmp4, err := os.Open(filePath + fmp4File)
		if err != nil {
			return
		}
		defer fmp4.Close()
		b, _ := ioutil.ReadAll(fmp4)
		buf.Write(b)
		w.Header().Set("Content-Type", "video/mp4")
	}
	w.Header().Set("Content-Length", fmt.Sprintf("%d", buf.Len()))
	w.Header().Set("Access-Control-Allow-Origin", "*")
	w.Header().Set("Access-Control-Allow-Headers", "*")
	w.Header().Set("Access-Control-Allow-Credentials", "true")
	w.Write(buf.Bytes())
}

//http://127.0.0.1:19999/vod/stream.m3u8
func main() {
	mux := http.NewServeMux()
	mux.HandleFunc("/vod/", onHLSVod)
	server := http.Server{
		Addr:         ":19999",
		Handler:      mux,
		ReadTimeout:  time.Second * 10,
		WriteTimeout: time.Second * 10,
	}
	fmt.Println("server.listen")
	fmt.Println(server.ListenAndServe())
}

使用ffplay播放测试下

ffplay -i stream.m3u8

使用hls.js demo播放

hls.js demo地址:hls.js demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/43786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Yolov5算法解读

yolov5于2020年由glenn-jocher首次提出,直至今日yolov5仍然在不断进行升级迭代。 Yolov5有YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x四个版本。文件中,这几个模型的结构基本一样,不同的是depth_multiple模型深度和width_multiple模型宽度这两个参…

[网络] TCP协议中的三次握手是什么?利用3次握手的SYN Flood DDOS攻击知道吗?

文章目录前言术语TCP协议三次握手的由来网络协议里的握手阶段Sequence Number是什么?TCP协议三次握手都发送了什么数据?TCP数据包长什么样?SYN Flood DDOS攻击是什么?结语前言 介于TCP协议中三次握手经常会被问到,以及…

NBA体育决策和数据挖掘分析

业务挑战 体育运用大数据主要体现在以下三个方面: 预测比赛结果和奖牌归属;更好地训练运动员 。数据和模型驱动体育决策让获胜和成功变得更有可能,体育统计(Sports Analytics)成为体育竞争的“杀手锏”。最近我们被客户要求撰写关于体育统计…

鲲鹏devkit性能分析工具介绍(一)

鲲鹏devkit性能分析工具介绍(一) 鲲鹏性能分析工具由四个子工具组成,分别为:系统性能分析、Java性能分析、系统诊断和调优助手。 系统性能分析是针对基于鲲鹏的服务器的性能分析工具,能收集服务器的处理器硬件、操作…

从2022安洵杯[babyPHP]看Soap+CLRF造成SSRF漏洞

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、PHP SOAP 二、漏洞成因 三、 题目知识准备 1、PHP Session反序列化 2、题目相关函数 四、[LCTF 2018]bestphps revenge 五、2022安洵杯 BabyPHP 前言 …

基于ASP.net的服装商城设计

目录 海秀衣城系统 2 1.概 述 2 1.1 网上购物的发展 2 1.2 三层架构技术简介 2 2. 系统总体设计 4 2.1 开发以及运行环境 4 2.2项目结构分析 4 2.3系统功能总体结构图 5 2.4系统功能结构分解图 5 3. 数据库设计 6 3.1 数据库设计 6 3.2 数据表 7 4. 模块设计 10 4.1 前端功能模…

SpringCloud微服务实践之七 网关(Gateway)

一、网关基本概念 (一)网关功能 身份认证和权限校验服务路由、负载均衡请求限流 (二)网关技术选型 SpringCloud提供了两个组件都可以实现网关功能: gatewayzuul 其中,Zuul是基于Servlet的实现&#xff…

SQL注入漏洞 | 数字型

文章目录前言MySQL 数字型前言 SQL注入漏洞 | iwebsec MySQL 数字型 页面观察:测试看回显 注入点判断:发现有sql注入漏洞 AND 可在 where 子语句中把两个或多个条件结合起来。如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录…

HBuilder X实现tabBar底部导航记录

首先,打开uniapp官网,找到tarbar官方文档,仔细阅读,具体位置如下,全局配置下面的pages.json页面路由里面找到tabBar,点击查看: 重点注意这两句话: 找到文档我们就可以按照上面的提示…

迭代器模式(Iterator)

参考: 迭代器设计模式 (refactoringguru.cn) [design-patterns-cpp/Iterator.cpp at master JakubVojvoda/design-patterns-cpp GitHub 文章目录一、什么是迭代器模式?二、实现三、优缺点优点缺点一、什么是迭代器模式? 提供一种方法&…

QFont-使用外部字体文件的问题

我们程序里面定义了某个结构体(这里简单描述为AStruct),AStruct包含了一个QFont 类型的成员变量: struct AStruct {QFont ft; }; 在具体业务上,AStruct中的QFont会被传递给QPainter去绘制文本。 保存工程/加载工程时时&#xff0…

用Python写个爬虫,赚了!

前言 编程语言排行榜(Tiobe)发布了11月新榜,Python仍领先Java和C,在全球众多的老牌编程语言中,以其他对手无法企及的极高份额稳居榜单第一位。 榜单数据是客观真实的,当下Python的使用者越来越多,已经远超使用其他十…

【Linux初阶】认识冯诺依曼结构

🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:计算机的冯诺依曼组成结构、冯诺依曼结构的数据交换特性,以宏观视角理解冯诺依曼下的网络数据传输…

Spring Cloud Alibaba 容器化部署最佳实践 | 本地部署版本详解

环境声明 在运行本地示例之前,需要保证本机具备以下的基础环境,如果您的本地没有当前的环境,下面会一步步进行搭建,演示搭建过程。 Nacos 服务端Seata 服务端RocketMQ 服务端MySQL 服务端 可在国内https://gitee.com/mirrors/S…

低代码在离散制造业的实践

大家上午好,非常感谢明道云给我这个机会,来展示一下这个上海电气在明道云上面的应用。我的题目是《低代码在离散制造业的实践》。 引入明道云的背景 首先介绍一下我们电气数字科技有限公司。它是在2018年的时候,上海电气集团内部成立的数科…

捷码全新快速表单功能解读

在最近的更新中,捷码迎来了比较多的功能上新,其中最受大家关注的是全新的表单功能。无论是从功能丰富度还是操作便利性上都做了大量设计。本文将从重点功能设置操作流程上进行演示说明。 表单控件和关联 ——1对1、1对n、n对n 支持多场景 首先是表单控…

航空货运数据挖掘那些事|航班换季

目录前言航班换季航班换季对航空货运业务有哪些影响参考文献前言 就在上个月月底,即2022年10月29日到2022年10月30日,中国民航完成了2022年的夏秋季航季到2022/23年冬春航季切换工作,俗称航班换季,那么何为航班换季呢&#xff0c…

流媒体传输 - RTMP 协议

RTMP 是 Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。它是由 Adobe 公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问…

氨基苯酚/多巴胺仿生修饰碳纳米管/α-氧化铝/ CNTs-Ag纳米复合材料

小编下面和大家来看间氨基苯酚/多巴胺仿生修饰碳纳米管/α-氧化铝/ CNTs-Ag纳米复合材料的制备! 多巴胺仿生修饰材料的研究: 通过表面聚多巴胺层与银离子的螯合作用,通过表面聚多巴胺与银离子的螯合作用,利用葡萄糖作还原剂,在聚多巴胺修饰的聚酯纤维表…

HarmonyOS应用API手势方法-PanGesture

描述:用于触发拖动手势事件,滑动的最小距离为5vp时拖动手势识别成功。 Api:从API Version 7开始支持 接口: PanGesture(value?: { fingers?: number; direction?: PanDirection; distance?: number } | PanGestureOptions)…