通过变量执行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
相关产品推荐
相关产品推荐

