FFmpeg解决视频播放加载卡顿问题(FFmpeg+M3U8分片)

FFmpeg解决视频播放加载卡顿问题(FFmpeg+M3U8分片)

在这里插入图片描述

在这静谧的时光里,我们能够更清晰地审视自己,思考未来的方向。每一步的坚实,都是对勇气的拥抱,每一个夜晚的努力,都是对未来的信仰。不要害怕独行,因为正是在寂静中,我们更能听见内心深处的声音,更能感受到梦想的脉动。

1.问题回顾

为什么会讨论这个问题呢,原因是我们做了一个在线培训系统,但是存在视频播放卡顿问题,按道理来说,这个是不应该的!因为服务器已经是顶配了,宽带甚至达到了上百,但是很可惜,几个人看视频都会卡顿!而且,这个对象存储还用的是华为云,当然,这里承认一件事,我们没有使用CDN。

这里我们大概介绍一下啥叫做CDN,作为一个拓展,就开始正文:

CDN(Content Delivery Network)是一种用于提高网站性能、可用性和安全性的网络架构。它通过将内容分发到离用户更近的服务器节点,从而减少延迟、提高加载速度,同时能够有效处理大流量和提供安全保障。以下是CDN技术的一些关键特点和组成部分:

1. 关键特点:

  • 较低的延迟和更快的加载速度: CDN通过在全球范围内的多个服务器节点分发内容,使用户能够从距离更近的服务器获取数据,从而减少延迟和提高加载速度。

  • 更高的可用性和可靠性: CDN通过将内容存储在多个地理位置的服务器上,提高了内容的冗余度,从而增加了系统的可用性和可靠性。

  • 减轻源服务器负担: CDN能够缓存并提供静态内容,减轻了源服务器的负载,使其更专注于动态内容的生成。

  • 大流量处理能力: CDN分布式的特性允许它有效地处理大量的并发请求,从而保证了高效的内容分发。

  • 提供安全性和防护: CDN通常具备一定的安全功能,例如DDoS攻击防护、Web应用程序防火墙(WAF)等,以增强对网站的安全保障。

2. CDN的组成部分:

  • 边缘服务器节点: CDN的核心组成部分是分布在全球各地的边缘服务器节点。这些节点存储着静态内容的副本,以便更快地响应用户请求。

  • 内容分发服务器(CDN服务器): 负责协调用户请求的CDN服务器,决定从哪个边缘节点提供服务,并负责内容的分发和管理。

  • 负载均衡器: 用于平衡用户请求的负载,确保每个边缘节点都得到合理的请求分发。

  • 缓存: 用于存储和管理缓存的组件,以便在需要时能够快速提供内容。

  • 安全功能: 包括DDoS防护、SSL加密、WAF等安全措施,以保护网站免受恶意攻击。

  • 分发协议: 用于确定如何将内容传递到用户的协议,常见的包括HTTP、HTTPS、以及最近的HTTP/2和HTTP/3。

3. CDN的工作原理:

  1. DNS解析: 用户发起请求时,通过DNS解析获得最近的CDN边缘节点的IP地址。

  2. 请求路由: CDN服务器根据负载均衡策略,将用户请求路由到最合适的边缘节点。

  3. 内容缓存: 边缘节点检查是否有所请求内容的缓存。如果存在,直接返回缓存内容,否则向源服务器请求并缓存内容。

  4. 内容返回: 边缘节点将请求的内容返回给用户,完成请求-响应过程。

CDN技术在提高网站性能、可用性和安全性方面发挥了重要作用,特别是在大规模内容分发的场景中,CDN的应用变得尤为关键。

2.技术解决

1.产品介绍

在经过大量的百度学习,我们发现一款开源大作:FFmpeg。对,就是这个神器!此物不仅仅说是应用于我们编程圈,再音视频多媒体圈也是颇具盛名!

FFmpeg(Fast Forward MPEG)是一个开源的多媒体处理工具集,它包含了音频和视频处理库、编码器、解码器、转码器等多种工具。以下是FFmpeg的主要功能介绍:

  1. 音视频编解码(Codec):
    • FFmpeg支持各种音频和视频编解码器,包括常见的H.264、H.265、AAC、MP3等,使其能够处理各种媒体格式。
  2. 格式转换:
    • 可以将不同格式的音频和视频文件相互转换,例如将MP4转换为AVI、将WAV转换为MP3等。
  3. 流媒体处理:
    • FFmpeg支持从网络摄像头、文件、或其他来源捕获音视频流,也能将处理后的流推送到服务器或其他设备。
  4. 图像处理:
    • FFmpeg不仅仅可以处理音视频,还支持图像处理,如提取视频帧,合成图片和视频等。
  5. 剪辑和编辑:
    • 可以对音视频进行剪辑和编辑,包括裁剪、剪切、拼接等操作。
  6. 字幕处理:
    • 支持字幕的添加、移除和编辑,可以将字幕嵌入到视频中或者从视频中提取字幕。
  7. 音频处理:
    • 提供了丰富的音频处理功能,包括音频的剪辑、混音、音量调节等。
  8. 实时视频处理:
    • FFmpeg能够处理实时的音视频流,适用于直播、视频会议等场景。
  9. 滤镜和效果:
    • 支持各种滤镜和效果,如模糊、旋转、调整亮度、对比度等。

FFmpeg的强大功能使其成为许多多媒体应用和服务的核心组件,例如视频编辑软件、流媒体服务器、嵌入式设备等。由于其广泛的支持和社区贡献,FFmpeg已经成为处理多媒体数据的重要工具之一。

由于我们的业务逻辑涉及到流媒体,那么,我们就把关注点放在流媒体处理!打蛇打七寸,我们着重下手!

2.流媒体处理

流媒体处理是一种通过网络实时传输音频和视频数据的技术,允许用户在数据传输的同时观看或听取内容,而不需要等待完整的文件下载。FFmpeg是一个强大的工具,广泛用于流媒体处理。以下是流媒体处理的主要方面以及FFmpeg在这些方面的应用:

  1. 流媒体捕获:
    • FFmpeg可以从各种来源捕获音频和视频流,包括摄像头、麦克风、文件、URL等。通过使用FFmpeg的输入模块,用户可以轻松地实现从这些源中捕获多媒体数据。
# 从摄像头捕获视频
ffmpeg -f v4l2 -i /dev/video0 output.mp4# 从麦克风捕获音频
ffmpeg -f alsa -i hw:0 output.wav# 从URL捕获网络流
ffmpeg -i http://example.com/stream.m3u8 output.mp4
  1. 流媒体转码:
    • 在流媒体处理中,有时需要将音视频数据转码为特定格式或编码,以适应不同的设备或网络条件。FFmpeg提供了广泛的编码器和解码器支持,使得转码变得简单。
# 将输入流转码为H.264视频和AAC音频
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4
  1. 流媒体推送:
    • FFmpeg可以将处理后的音视频流推送到流媒体服务器,以便在网络上进行分发。这对于实时直播和视频会议非常有用。
# 推送到RTMP服务器
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f flv rtmp://example.com/live/stream
  1. 实时流媒体处理:
    • FFmpeg支持实时处理音视频流,适用于需要低延迟的应用,如实时直播和视频通话。
# 实时捕获摄像头并推送到RTMP服务器
ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 -c:a aac -f flv rtmp://example.com/live/stream
  1. 流媒体过滤器:
    • FFmpeg提供了丰富的过滤器,可以对音视频流进行各种处理,如添加水印、调整亮度、旋转、裁剪等。
# 在视频上添加水印
ffmpeg -i input.mp4 -i watermark.png -filter_complex overlay=10:10 output.mp4
  1. 自适应比特率:
    • FFmpeg可以实现自适应比特率(Adaptive Bitrate Streaming,ABR),以根据用户的网络条件自动调整流的质量。
# 使用多个输出流实现自适应比特率
ffmpeg -i input.mp4 -c:v libx264 -b:v 2000k -c:a aac -b:a 128k -f hls -hls_time 4 -hls_playlist_type vod output.m3u8

上述示例展示了一些FFmpeg在流媒体处理中的常见用法。这些功能使FFmpeg成为流媒体处理的强大工具,适用于多种场景,包括在线直播、视频会议、实时通信等。

3.问题深入

由于我也是IT小学生,这里我简单说一下对于视频播放卡顿我的个人理解:

作为项目的参与者,我们是使用了华为云的对象存储,但是,在视频的播放的时候,我们并没有学习人家其他网站一样,使用m3u8格式进行分片传输,而是一股脑的直接把视频地址抛给前端,自己加载播放,这样子呢,如果大量请求,肯定存在卡顿现象。所以,要么转码,要么分片分批次

视频转码是将一个视频文件从一种编码或格式转换为另一种编码或格式的过程。这过程的目的是为了满足不同终端设备、网络环境或应用场景的需求,以提高视频的兼容性、播放效果、传输效率和存储效率。视频转码有以下一些主要作用:

  1. 兼容性提升: 不同的终端设备和播放器对视频格式和编码的支持有所差异。通过转码,可以将视频转换为广泛支持的格式,确保在各种设备和平台上都能正常播放。

  2. 播放效果优化: 转码可以改变视频的分辨率、比特率、帧率等参数,以适应不同的播放环境。例如,在移动设备上,可以将视频分辨率调整为适应小屏幕,以提高观看体验。

  3. 网络传输效率提高: 不同的网络环境对视频传输的带宽要求不同。通过调整视频的压缩率,可以降低视频文件的大小,提高在低带宽环境下的传输效率。

  4. 存储空间节省: 对于大型视频平台或存储服务提供商来说,原始视频文件可能占用大量存储空间。通过转码,可以将视频文件压缩成更小的文件,从而降低存储成本。

  5. 支持多码率自适应流: 多码率自适应流(Adaptive Bitrate Streaming,ABR)是一种通过提供不同比特率的视频流,以适应用户网络带宽的技术。转码可以生成多个不同比特率的视频流,以支持ABR,从而在播放时能够根据用户的网络情况动态切换清晰度。

  6. 格式转换: 转码可以将视频从一种格式转换为另一种格式,例如从AVI到MP4、从MKV到WebM等。这有助于确保视频在不同平台和设备上的兼容性。

M3U8是一种用于指定多媒体播放列表的格式,常用于流媒体协议中,特别是用于HTTP Live Streaming(HLS)协议。HLS通过将整个视频分成一系列小的、独立的.ts文件(Transport Stream),并使用M3U8播放列表来指导播放器在不同比特率和分辨率之间切换,以实现自适应流媒体传输。以下是M3U8分片的基本工作原理:

  1. 切片生成: 视频文件首先被切分成一系列小的.ts文件,每个文件包含视频的一小部分内容。这些切片通常有相同的持续时间,例如2秒或10秒。

  2. M3U8播放列表生成: 为了指导播放器正确地按顺序播放这些切片,一个M3U8播放列表文件被创建。该文件包含了所有切片的信息,包括其相对路径、时长、序号等。在M3U8文件中,包括了不同清晰度(多码率自适应流)的版本,以便播放器可以根据网络条件选择最合适的版本。

  3. 播放器请求和播放: 播放器通过HTTP请求M3U8文件,并解析其中的信息。然后,它根据M3U8文件中的信息逐个请求切片文件,并按顺序播放这些切片。

这个过程的优势在于,它允许根据用户的网络状况和设备性能自适应地调整视频质量。如果用户的网络速度较慢,播放器可以选择较低分辨率和比特率的切片,以确保连续的播放。如果网络条件改善,播放器可以选择更高质量的切片,提供更清晰的画面。

4.问题解决

使用FFmpeg来实现M3U8分片,通常需要进行两个主要步骤:首先是将原始视频文件切分成一系列小的.ts文件,然后是生成一个包含这些切片信息的M3U8播放列表。以下是一个简单的示例:

步骤1:切片生成

使用以下命令将原始视频文件切分成.ts文件:

ffmpeg -i input_video.mp4 -c copy -bsf:v h264_mp4toannexb -f segment -segment_time 10 -segment_list output_playlist.m3u8 -segment_format mpegts output_%03d.ts
  • -i input_video.mp4:指定输入视频文件。
  • -c copy:保持视频和音频的原始编码。
  • -bsf:v h264_mp4toannexb:将H.264编码的视频转换为MPEG-TS格式。
  • -f segment:指定输出格式为segment。
  • -segment_time 10:每个切片的时长,这里设置为10秒。
  • -segment_list output_playlist.m3u8:指定M3U8播放列表的文件名。
  • -segment_format mpegts:指定切片的格式为MPEG-TS。
  • output_%03d.ts:输出切片的文件名模板,%03d 表示三位数的序号。

步骤2:生成M3U8播放列表

使用以下命令生成M3U8播放列表:

ffmpeg -f concat -safe 0 -i output_playlist.m3u8 -c copy -bsf:a aac_adtstoasc output_final.m3u8
  • -f concat:指定输入文件格式为concat。
  • -safe 0:允许使用相对路径。
  • -i output_playlist.m3u8:指定输入M3U8播放列表文件。
  • -c copy:保持原始编码。
  • -bsf:a aac_adtstoasc:将AAC音频流的ADTS头转换为MPEG-4 Audio(asc)格式。

最终,output_final.m3u8 将包含所有切片信息,可以被用作HLS流的播放列表。

请注意,这只是一个简单的示例,实际应用中可能需要更多的参数配置,例如视频编码选项、分辨率、比特率等,以满足特定需求。此外,FFmpeg的命令行参数可能会根据不同的版本有所变化,请根据您使用的版本查阅相关文档。

3.代码实现

使用Java代码调用FFmpeg库以完成M3U8分片的操作可以使用Java的ProcessBuilder类。以下是一个简单的Java代码示例,用于调用FFmpeg执行上述步骤:

import java.io.IOException;public class FFmpegHLSProcessor {public static void main(String[] args) {String inputVideoPath = "input_video.mp4";String outputPlaylistPath = "output_playlist.m3u8";String outputFinalPath = "output_final.m3u8";// Step 1: 切片生成try {ProcessBuilder processBuilder = new ProcessBuilder("ffmpeg", "-i", inputVideoPath,"-c", "copy", "-bsf:v", "h264_mp4toannexb","-f", "segment", "-segment_time", "10","-segment_list", outputPlaylistPath,"-segment_format", "mpegts","output_%03d.ts");processBuilder.redirectErrorStream(true);Process process = processBuilder.start();process.waitFor();} catch (IOException | InterruptedException e) {e.printStackTrace();}// Step 2: 生成M3U8播放列表try {ProcessBuilder processBuilder = new ProcessBuilder("ffmpeg", "-f", "concat", "-safe", "0", "-i", outputPlaylistPath,"-c", "copy", "-bsf:a", "aac_adtstoasc",outputFinalPath);processBuilder.redirectErrorStream(true);Process process = processBuilder.start();process.waitFor();} catch (IOException | InterruptedException e) {e.printStackTrace();}}
}

请确保系统上已经安装了FFmpeg,并且Java应用程序可以调用它。

4.总结

大概得解决思路如上,当然,FFmpeg是免费的,CDN是增值服务,各有优劣!

对于FFmpeg+M3U8实现的分片技术,实际生产中肯定还会涉及到复杂的业务逻辑,更具具体情况请多加揣测。

拜拜,我要设计业务逻辑去了!

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

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

相关文章

spring boot application yaml key下划线如何转java的Properties对象字段驼峰

spring boot yaml key和value如何映射到Properties对象 下面以MybatisPlusProperties为例 ##java properties 字段驼峰 ##yaml文件如图,key使用下划线 ##java对象驼峰转下划线匹配yaml文件key DataObjectPropertyName.toDashedForm(name);//驼峰转下划线 ##设置P…

开发er们必知的Git命令

Git和GitHub是每位软件工程师都必须了解的最基本的东西。这些工具是开发人员日常工作的组成部分,因为我们每天都要与它们进行交互。熟练掌握Git不仅能简化您的生活,还能显著提高生产力。在这篇博文中,我们将探索一组命令,这些命令将大大提高您的生产力。随着您对这些命令的掌握…

Codeforces Round 779 (Div. 2) D2. 388535(思维题 二进制性质/trie树上最大最小异或)

题目 t(t<1e5)组样例&#xff0c;每次给定l,r(0<l<r<2^17) 和r-l1个数ai&#xff0c;新序列是被[l,r]这些数异或上同一个x得到的&#xff0c; 求出x&#xff0c;有多个输出任意一个即可 思路来源 官方题解 洛谷题解 Educational Codeforces Round 157 (Rated…

Linux系统使用超详细(十)~vi/vim命令①

vi/vim命令有很多&#xff0c;其实只有少数的用法对于我们日常工作中起到了很大帮助&#xff0c;但是既然我选择梳理Linux的学习笔记&#xff0c;那么一定全力把自己的理解和学习笔记的内容认真整理汇总&#xff0c;内容或许有错误&#xff0c;还请发现的C友们发现了及时指出。…

CTFhub-phpinfo

CTFhub-Web-信息泄露-“phpinfo” 题目信息 解题过程 ctrlF搜索关键字…

探索数据之美:深入Seaborn的数据可视化艺术与技巧【第26篇—python:Seaborn】

文章目录 1. 引言2. Seaborn基础2.1 安装和环境设置2.2 常用数据可视化函数2.3 设置样式和颜色主题 3. 数据准备与导入3.1 使用Pandas库加载和处理数据3.2 数据清理和缺失值处理 4. Seaborn中的常见图表4.1 折线图和散点图&#xff1a;展示趋势和变量关系4.2 条形图和箱线图&am…

树莓派4B-Python-使用PCA9685控制舵机云台+跟随人脸转动

系列文章 树莓派4B-Python-控制舵机树莓派-Pico控制舵机树莓派4B-Python-使用PCA9685控制舵机云台跟随人脸转动&#xff08;本文章&#xff09; 目录 系列文章前言一、SG90s舵机是什么&#xff1f;二、PCA9685与舵机信号线的接线图三、控制SG90s云台&#xff08;也可用来测试舵…

MongoDB Compass 的教程

第一步&#xff1a;建立连接 点击Save&Connect 增加数据库&#xff1a; 填写数据库名字和文档名字并点击Create Database 删除文档&#xff1a; 创建文档&#xff1a; 插入文档数据 {Id:1001,name:"cyl",age:21} 插入成功&#xff1a; 更改原有数据 删除原有数据…

ACM论文LaTeX模板解析(二)| documentclass设置

本文收录于专栏&#xff1a;ACM 论文 LaTeX模板解析&#xff0c;本专栏将会围绕ACM 论文 LaTeX模板解析持续更新。欢迎点赞收藏关注&#xff01; 文章目录 要使用documentclass类&#xff0c;请在文件的开头中写明&#xff1a; \documentclass[⟨options⟩]{acmart}有几个选项…

SpringBoot-项目部署

SpringBoot项目部署可以通过将项目打成可执行的jar包或war包来实现&#xff0c;也可以使用容器化技术如Docker将项目部署到云平台中。在部署时需要注意配置文件的位置和启动参数的设置&#xff0c;同时确保目标环境中的Java版本与项目所需的Java版本一致。部署完成后&#xff0…

【Nuxt3】Nuxt3脚手架nuxi安装项目和项目目录介绍

简言 最近学了Nuxt3,并使用它创建了自己的小网站。记录下学习到的nuxt3内容。 Nuxt3官网 Nuxt 是一个免费的开源框架&#xff0c;可通过直观、可扩展的方式使用 Vue.js 创建类型安全、高性能、生产级的全栈 Web 应用程序和网站。 支持SSR、SPA、建立静态网站&#xff0c;也可以…

如何在BTC生态中创造独特的数字资产?bitget教程

BRC-20通证是什么&#xff1f; 听说了吗&#xff1f;BRC-20通证在比特币上搞事情啦&#xff01;它们不依赖智能合约&#xff0c;直接在比特币的最小单位上动手脚。这就像在用最小的积木搭房子&#xff0c;太神奇了&#xff01;虽然现在还在实验阶段&#xff0c;但已经有很多人…

12AOP面向切面编程/GoF之代理模式

先看一个例子&#xff1a; 声明一个接口&#xff1a; // - * / 运算的标准接口! public interface Calculator {int add(int i, int j);int sub(int i, int j);int mul(int i, int j);int div(int i, int j); }实现该接口&#xff1a; package com.sunsplanter.prox…

流星全自动网页生成系统重构版源码

流星全自动网页生成系统重构版源码分享&#xff0c;所有模板经过精心审核与修改&#xff0c;完美兼容小屏手机大屏手机&#xff0c;以及各种平板端、电脑端和360浏览器、谷歌浏览器、火狐浏览器等等各大浏览器显示。 为用户使用方便考虑&#xff0c;全自动网页制作系统无需繁琐…

错误处理(基于ESP-IDF)

主要参考资料 B站Up主孤独的二进制《错误处理 - 乐鑫 ESP32 物联网开发框架 ESP-IDF 开发入门》 ESP-IDF编程指南>API指南>错误消息: https://docs.espressif.com/projects/esp-idf/zh_CN/v5.1/esp32s3/api-guides/error-handling.html ESP-IDF编程指南>API指南>严…

二、QT下载、安装及问题解决(windows系统)

本章节最重要的一点&#xff1a;安装时&#xff0c;路径中不能有中文&#xff0c;切记&#xff0c;否则QT不能正常运行。 下载两种途径&#xff1a; 1、官网下载&#xff0c;慢且不好访问&#xff1b; 2、国内一些大学网站的镜像&#xff0c;下载比较快&#xff0c;但是可能…

Android中的anr定位指导与建议

1.背景 8月份安卓出现了一次直播间卡死(ANR)问题&#xff0c;且由于排查难度较大&#xff0c;持续了较长时间。本文针对如何快速定位安卓端出现ANR问题进行总结和探讨. 这里大致补充一下当时的情况,当时看到情景的是从某一个特定的场景下进入直播间后整个直播间界面立刻就卡住…

lenovo联想笔记本电脑拯救者Legion Y7000 2019 PG0(81T0)原装出厂Windows10系统

链接&#xff1a;https://pan.baidu.com/s/1fn0aStc4sfAfgyOKtMiCCA?pwdas1l 提取码&#xff1a;as1l 联想拯救者原厂Win10系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;…

更换为mainwindow.ui更新工程架构

文章目录 前言一、新建带mainwindow.ui的工程1.新建工程2. 添加工程模块添加opencv的库3.添加资源3.1工程上添加资源3.2引用资源 4.添加曲线文件4.1 复制关键文件到新工程4.2 新进显示曲线的ui带.h的为了方面名字取一样4.3添加曲线显示控件4.4 添加工具 5. 添加曲线.h文件内容6…

MySQL之单表查询

素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政治面貌 varchar(10) NO…