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

通过变量执行Shaka Packager命令仅处理最后视频的问题

解决Shaka Packager通过Bash变量传递多输入参数仅处理最后一个文件的问题

问题原因

你遇到的问题根源是Bash的字符串参数展开逻辑:当你用"$inputs"的方式传递变量时,Bash会把整个变量的内容当作单个参数传给packager,而不是拆分成多个独立的--input项。packager解析时只会识别最后一个有效的输入定义,所以只处理了360p的视频。

解决方案:用Bash数组存储参数(推荐)

Bash数组可以完美解决多参数拆分的问题,每个输入项作为数组的独立元素,传递时能被正确解析为单独的命令行参数:

# 初始化空数组存储所有输入参数
inputs=()

# 遍历converted目录下的所有MP4文件,生成对应的输入参数
for video_file in converted/*.mp4; do
  # 从文件名提取分辨率标识(比如从x_720p.mp4得到720p)
  resolution=$(basename "$video_file" .mp4 | awk -F'_' '{print $2}')
  
  # 把音频、视频流的输入参数添加到数组
  inputs+=(
    "--input=$video_file,stream=audio,output=audio.mp4"
    "--input=$video_file,stream=video,output=video_${resolution}.mp4"
  )
done

# 执行packager,用数组展开传递参数(关键:${inputs[@]})
sudo packager "${inputs[@]}"

为什么这个方法有效?

${inputs[@]}会将数组中的每个元素作为独立的命令行参数传递给packager,完全符合它的参数格式要求,和你手动写单行命令的效果完全一致。

兼容Widevine加密的扩展

要添加Widevine加密参数,直接把加密相关的参数也放到数组里(或者单独建一个加密参数数组),执行时合并即可:

# 定义Widevine加密参数(替换为你的实际配置)
widevine_params=(
  "--enable_widevine_encryption"
  "--key_server_url=https://your-widevine-service-url"
  "--content_id=your-unique-content-id"
  "--signer=your-signer-name"
  "--aes_signing_key=your-signing-key"
  "--aes_signing_iv=your-signing-iv"
)

# 合并输入参数和加密参数执行
sudo packager "${inputs[@]}" "${widevine_params[@]}"

不推荐的方案:无引号展开字符串变量

如果坚持用字符串变量存储参数,也可以去掉$inputs的双引号,但这个方法风险极高——如果文件名包含空格、特殊字符,会直接导致参数解析错误:

inputs=""
for video_file in converted/*.mp4; do
  resolution=$(basename "$video_file" .mp4 | awk -F'_' '{print $2}')
  inputs="$inputs --input=$video_file,stream=audio,output=audio.mp4 --input=$video_file,stream=video,output=video_${resolution}.mp4"
done

# 注意:这里不加双引号,让Bash自动拆分参数,但文件名含空格会失效
sudo packager $inputs

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:00:24