明天的明天 永远的永远 未知的一切 我与你一起承担 ??

是非成败转头空 青山依旧在 几度夕阳红 。。。
  博客园  :: 首页  :: 管理

uniapp播放mp4省流方案 (视频切片m3u8 解决方案)

Posted on 2024-06-24 14:43  且行且思  阅读(360)  评论(0)    收藏  举报
背景:
        因为项目要播放一个宣传和讲解视频,视频文件过大,同时还为了节省存储流量,想到了一个方案,用m3u8切片替代mp4。

        m3u8:切片播放,可以理解为一个1G的视频文件,自行设置文件分割大小,通过切片,把视频1G分割成若干个小片段,播放的时候由.m3u8文件来指定在某个时间节点播放某个切片,好处就是拖动进度条不需要下载1G的文件,只需要根据m3u8记录的拖动时间的.ts文件进行下载播放。

        mp4:文件流,下载完之后再播放,这个1G先转圈圈下载,下载完之后再播放。

实现切片,需要两步

一、安装工具

首先我们需要下载所需的工具(ffmpeg)

https://www.gyan.dev/ffmpeg/builds/

 

 

将这三个文件放置:

C:\Windows\System32 

或者 进入解压目录,按shift + 右键 》》powershell , 进入当前命令窗口

 

管理员CMD运行:ffmpeg

 

 

二、切片

 

操作命令有很多,可自行查找,这条是一个简单的切片命令。

ffmpeg -i 0.mp4 -codec copy  -hls_list_size 0  -strict -2  -f hls G:\项目\郑好\video.m3u8

 

 

 

视频播放地址:https://xxxxxxroutine/video/1/video.m3u8

 

 

针对微信小程序播放的FFmpeg M3U8切片配置:

基本命令格式

ffmpeg -i "源目录/input.mp4" -c:v libx264 -c:a aac -f hls -hls_time 10 -hls_playlist_type vod "目标目录/output.m3u8"

微信小程序优化配置

ffmpeg -i "D:/videos/source.mp4" \
  -c:v libx264 -profile:v baseline -level 3.0 \
  -c:a aac -ar 44100 -b:a 128k \
  -s 720x1280 -r 25 -b:v 1500k \
  -f hls -hls_time 6 -hls_list_size 0 \
  -hls_playlist_type vod \
  -hls_segment_filename "D:/output/segment_%03d.ts" \
  "D:/output/playlist.m3u8"

关键参数说明

编码格式(必须):

  •  -c:v libx264 -profile:v baseline -level 3.0

     - H.264基线档案,兼容性最好 
  •  -c:a aac -ar 44100 -b:a 128k

     - AAC音频编码 
  • -hls_list_size 0 - 包含所有片段(默认值5会限制片段数量)
  • -hls_playlist_type vod - 设置为点播模式

微信小程序优化:

  •  -s 720x1280

     - 适合手机竖屏 
  •  -r 25

     - 帧率25fps 
  •  -b:v 1500k

     - 视频码率1.5Mbps 
  •  -hls_time 6

     - 每段6秒(推荐6-10秒) 

文件路径设置:

  •  -hls_segment_filename

     - 指定TS片段文件名格式 
  • 最后的参数 - M3U8播放列表文件路径

 

批处理脚本示例

Windows批处理:

@echo off
chcp 65001 >nul
echo 开始视频转换...

set SOURCE_DIR=D:\ChengDev\视频切片
set OUTPUT_DIR=D:\ChengDev\视频切片\output

REM 检查源目录是否存在
if not exist "%SOURCE_DIR%" (
    echo 错误:源目录不存在 %SOURCE_DIR%
    pause
    exit /b 1
)

REM 创建输出目录
if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%"

REM 检查是否有MP4文件
dir "%SOURCE_DIR%\*.mp4" >nul 2>&1
if errorlevel 1 (
    echo 错误:源目录中没有找到MP4文件
    pause
    exit /b 1
)

REM 转换所有MP4文件 - 优化参数匹配5.17Mbps码率
for %%f in ("%SOURCE_DIR%\*.mp4") do (
    echo 正在转换: %%~nxf
    ffmpeg -i "%%f" ^
        -c:v libx264 ^
        -preset medium ^
        -crf 23 ^
        -maxrate 6000k ^
        -bufsize 12000k ^
        -profile:v high ^
        -level 4.0 ^
        -c:a aac ^
        -b:a 128k ^
        -ar 44100 ^
        -f hls ^
        -hls_time 2.4 ^
        -hls_list_size 0 ^
        -hls_flags delete_segments ^
        -hls_segment_type mpegts ^
        -hls_segment_filename "%OUTPUT_DIR%\%%~nf_%%03d.ts" ^
        "%OUTPUT_DIR%\%%~nf.m3u8"
    
    if errorlevel 1 (
        echo 转换失败: %%~nxf
    ) else (
        echo 转换完成: %%~nxf
        REM 简单处理M3U8文件
        if exist "%OUTPUT_DIR%\%%~nf.m3u8" (
            findstr /v "ALLOW-CACHE" "%OUTPUT_DIR%\%%~nf.m3u8" > "%OUTPUT_DIR%\%%~nf_temp.txt"
            if exist "%OUTPUT_DIR%\%%~nf_temp.txt" (
                copy "%OUTPUT_DIR%\%%~nf_temp.txt" "%OUTPUT_DIR%\%%~nf.m3u8" >nul
                del "%OUTPUT_DIR%\%%~nf_temp.txt"
            )
        )

        echo 生成的M3U8: %OUTPUT_DIR%\%%~nf.m3u8
    )
)

echo.
echo 所有转换完成!
echo 输出目录: %OUTPUT_DIR%
pause

重要注意事项

  1. 编码格式必须兼容

    • 视频:H.264 Baseline Profile

    • 音频:AAC LC

  2. 文件路径

    • 使用绝对路径避免错误

    • Windows路径用反斜杠或双引号

  3. 微信小程序限制

    • 单个视频文件不超过50MB

    • 建议码率不超过2Mbps

    • 支持HTTPS协议访问