Skip to content

Instantly share code, notes, and snippets.

@keima
Last active June 1, 2025 17:15
Show Gist options
  • Select an option

  • Save keima/dd5195d6e0a803227079bdfca0047515 to your computer and use it in GitHub Desktop.

Select an option

Save keima/dd5195d6e0a803227079bdfca0047515 to your computer and use it in GitHub Desktop.
const AUDIO_ENCODER="aac",
AUDIO_CHANNEL=1,
AUDIO_BITRATE="64k",
AUDIO_SAMPLERATE="48k",
AUDIO_LANG_TAG="und";
const PREFERRED_LANG_TAGS = ["jp", "en", "und"]
function appendAudioStream({
args,
streams,
langTag,
audioEncoder,
wantedChannelCount,
wantedBitrate,
wantedSampleRate,
}){
const audioStreams = streams.filter((stream) => stream.codec_type === 'audio')
if (audioStreams.length === 0) {
args.jobLog(`No audio streams found. Skipping \n`);
return
}
var baseAudioStream = audioStreams.reduce(
(selected, stream) => {
// langTag: unmatch -> selected win
if (!PREFERRED_LANG_TAGS.some((langTag) =>
stream.tags?.language?.toLowerCase().includes(langTag) === true
)) {
return selected
}
// channel count
if (selected.channels > stream.channels) {
return selected
}
return stream
// TODO: sample_rate, bitrate check
},
audioStreams[0],
);
// TODO: 既に変換したい音源があればスキップする
const channelCount = Math.min(wantedChannelCount, baseAudioStream.channels),
bitrate = wantedBitrate,
sampleRate = wantedSampleRate;
args.jobLog(`Adding ${langTag} stream in ${audioEncoder}, ${channelCount} channels \n`);
// mark as removed for all audio stream
audioStreams.forEach((stream) => { stream.removed = true });
const streamCopy = JSON.parse(JSON.stringify(baseAudioStream))
streamCopy.removed = false;
streamCopy.index = streams.length;
streamCopy.tags = {
language: AUDIO_LANG_TAG,
}
streamCopy.outputArgs.push('-c:{outputIndex}', audioEncoder);
streamCopy.outputArgs.push('-ac', `${channelCount}`);
// if (enableBitrate)
streamCopy.outputArgs.push(`-b:a:{outputTypeIndex}`, `${bitrate}`);
// if (enableSamplerate)
streamCopy.outputArgs.push('-ar', `${sampleRate}`);
// -metadata:s:a:0 language=eng
streamCopy.outputArgs.push('-metadata:s:a:{outputTypeIndex}', `language=${langTag}`)
args.variables.ffmpegCommand.shouldProcess = true;
streams.push(streamCopy);
}
module.exports = async (args) => {
const { streams } = args.variables.ffmpegCommand;
appendAudioStream({
args,
streams,
langTag: AUDIO_LANG_TAG,
audioEncoder: AUDIO_ENCODER,
wantedChannelCount: AUDIO_CHANNEL,
wantedBitrate: AUDIO_BITRATE,
wantedSampleRate: AUDIO_SAMPLERATE,
});
return {
outputFileObj: args.inputFileObj,
outputNumber: 1,
variables: args.variables,
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment