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
问题分析与修复方案
核心错误原因
-var_stream_map参数重复使用:FFmpeg不支持多次指定该参数,两次声明导致流映射逻辑混乱,触发内存分配异常。- 音频流冗余映射:重复映射英文、印地语音频轨各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
关键修改说明
- 合并
-var_stream_map参数:将所有流映射规则整合到一个参数中,每个视频流绑定对应的两条音频流,通过agroup:audio统一分组,确保播放器支持语言切换。 - 简化音频映射:每条音频轨仅映射一次,添加语言标识和标题元数据,提升播放器兼容性。
- 优化内存相关参数:原队列参数设置过大导致内存占用过高,调整为合理值减少资源消耗。
- 明确视频流命名:在映射规则中指定每个分辨率的名称,让主播放列表结构更清晰。
内容的提问来源于stack exchange,提问作者user3309447
相关产品推荐
相关产品推荐

