Last active
June 1, 2025 17:15
-
-
Save keima/dd5195d6e0a803227079bdfca0047515 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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