You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FFmpeg多码率多语言HLS转码内存分配失败问题求助

问题

需要将1个视频轨与2个音频轨(英文、印地语)合并转码为支持多码率、多语言的HLS流,目标生成720p、480p、360p三种分辨率,同时包含英/印地语两条音频轨。执行FFmpeg命令后出现内存分配失败错误,命令及输出如下:

执行命令

ffmpeg-5.0.1-amd64-static/ffmpeg -i raw/vid_only.mp4 -i raw/english.mp3 -i raw/hindi.mp3 \
-c:a:0 aac \
-c:a:1 aac \
-filter_complex \
"[0:v]split=3[v1][v2][v3]; \
[v1]scale=w=1280:h=720[v1out]; [v2]scale=w=854:h=480[v2out]; [v3]scale=w=640:h=360[v3out]" \
-map [v1out] -c:v:0 libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v:0 5M -maxrate:v:0 5M -minrate:v:0 5M -bufsize:v:0 10M -preset slow -g 48 -sc_threshold 0 -keyint_min 48 \
-map [v2out] -c:v:1 libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v:1 3M -maxrate:v:1 3M -minrate:v:1 3M -bufsize:v:1 3M -preset slow -g 48 -sc_threshold 0 -keyint_min 48 \
-map [v3out] -c:v:2 libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v:2 1M -maxrate:v:2 1M -minrate:v:2 1M -bufsize:v:2 1M -preset slow -g 48 -sc_threshold 0 -keyint_min 48 \
-map 1:a -c:a:0 aac -b:a:0 96k -ac 2 \
-map 1:a -c:a:1 aac -b:a:1 96k -ac 2 \
-map 1:a -c:a:2 aac -b:a:2 48k -ac 2 \
-map 2:a -c:a:0 aac -b:a:0 96k -ac 2 \
-map 2:a -c:a:1 aac -b:a:1 96k -ac 2 \
-map 2:a -c:a:2 aac -b:a:2 48k -ac 2 \
-var_stream_map "a:0,agroup:audio,default:yes a:1,agroup:audio v:0,agroup:audio" \
-var_stream_map "v:0,name:720p v:1,name:480p v:2,name:360p" v%v/index.m3u8 \
-master_pl_name master.m3u8 \
-f hls \
-hls_time 6 \
-hls_list_size 0 \
-hls_playlist_type vod \
-hls_flags independent_segments \
-hls_segment_type mpegts \
-hls_segment_filename v%v/data%02d.ts \
-max_muxing_queue_size 80072 \
-muxing_queue_data_threshold 30036

错误输出

[hls @ 0x59c3340] Unable to find mapping variant stream00:00.00 bitrate=N/A speed=   0x    
av_interleaved_write_frame(): Cannot allocate memory
[hls @ 0x59c3340] Unable to find mapping variant stream
av_interleaved_write_frame(): Cannot allocate memory
[hls @ 0x59c3340] Unable to find mapping variant stream
av_interleaved_write_frame(): Cannot allocate memory
[hls @ 0x59c3340] Unable to find mapping variant stream
av_interleaved_write_frame(): Cannot allocate memory
[hls @ 0x59c3340] Unable to find mapping variant stream
av_interleaved_write_frame(): Cannot allocate memory
[hls @ 0x59c3340] Unable to find mapping variant stream
av_interleaved_write_frame(): Cannot allocate memory
[hls @ 0x59c3340] Unable to find mapping variant stream
[hls @ 0x59c3340] Opening 'v720p/index0.ts' for writing
[hls @ 0x59c3340] Opening 'v720p/index.m3u8.tmp' for writing
[hls @ 0x59c3340] Opening 'v480p/index0.ts' for writing
[hls @ 0x59c3340] Opening 'v480p/index.m3u8.tmp' for writing
[hls @ 0x59c3340] Opening 'v360p/index0.ts' for writing
[hls @ 0x59c3340] Opening 'v360p/index.m3u8.tmp' for writing
Error writing trailer of v%v/index.m3u8: Cannot allocate memory

问题分析与修复方案

核心错误原因

  1. -var_stream_map参数重复使用:FFmpeg不支持多次指定该参数,两次声明导致流映射逻辑混乱,触发内存分配异常。
  2. 音频流冗余映射:重复映射英文、印地语音频轨各3次,无意义地增加内存占用和处理负载。
  3. 多语言分组逻辑错误:原命令中音频与视频的分组关联规则不清晰,播放器无法正确识别多语言切换逻辑。

修正后的FFmpeg命令

ffmpeg-5.0.1-amd64-static/ffmpeg -i raw/vid_only.mp4 -i raw/english.mp3 -i raw/hindi.mp3 \
-filter_complex \
"[0:v]split=3[v1][v2][v3]; \
[v1]scale=1280:720[v720]; [v2]scale=854:480[v480]; [v3]scale=640:360[v360]" \
# 视频流编码配置
-map [v720] -c:v:0 libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v:0 5M -maxrate:v:0 5M -minrate:v:0 5M -bufsize:v:0 10M -preset slow -g 48 -sc_threshold 0 -keyint_min 48 \
-map [v480] -c:v:1 libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v:1 3M -maxrate:v:1 3M -minrate:v:1 3M -bufsize:v:1 6M -preset slow -g 48 -sc_threshold 0 -keyint_min 48 \
-map [v360] -c:v:2 libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v:2 1M -maxrate:v:2 1M -minrate:v:2 1M -bufsize:v:2 2M -preset slow -g 48 -sc_threshold 0 -keyint_min 48 \
# 音频流编码与元数据配置
-map 1:a -c:a:0 aac -b:a:0 96k -ac 2 -metadata:s:a:0 language=eng -metadata:s:a:0 title="English" \
-map 2:a -c:a:1 aac -b:a:1 96k -ac 2 -metadata:s:a:1 language=hin -metadata:s:a:1 title="Hindi" \
# 统一流映射规则:每个分辨率绑定两条音频,指定分组
-var_stream_map "v:0,a:0,a:1,name:720p,agroup:audio v:1,a:0,a:1,name:480p,agroup:audio v:2,a:0,a:1,name:360p,agroup:audio" \
# HLS全局配置
-master_pl_name master.m3u8 \
-f hls \
-hls_time 6 \
-hls_list_size 0 \
-hls_playlist_type vod \
-hls_flags independent_segments \
-hls_segment_type mpegts \
-hls_segment_filename v%v/data%02d.ts \
# 合理调整队列参数,降低内存占用
-max_muxing_queue_size 1024 \
-muxing_queue_data_threshold 512

关键修改说明

  1. 合并-var_stream_map参数:将所有流映射规则整合到一个参数中,每个视频流绑定对应的两条音频流,通过agroup:audio统一分组,确保播放器支持语言切换。
  2. 简化音频映射:每条音频轨仅映射一次,添加语言标识和标题元数据,提升播放器兼容性。
  3. 优化内存相关参数:原队列参数设置过大导致内存占用过高,调整为合理值减少资源消耗。
  4. 明确视频流命名:在映射规则中指定每个分辨率的名称,让主播放列表结构更清晰。

内容的提问来源于stack exchange,提问作者user3309447

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:30:42