media/transcoder/createJobWithConcatenatedInputs.js (114 lines of code) (raw):

/** * Copyright 2021, Google, Inc. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ 'use strict'; function main( projectId, location, inputUri1, startTimeOffset1, endTimeOffset1, inputUri2, startTimeOffset2, endTimeOffset2, outputUri ) { // [START transcoder_create_job_with_concatenated_inputs] /** * TODO(developer): Uncomment these variables before running the sample. */ // projectId = 'my-project-id'; // location = 'us-central1'; // inputUri1 = 'gs://my-bucket/my-video-file1'; // startTimeOffset1 = 0; // endTimeOffset1 = 8.1; // inputUri2 = 'gs://my-bucket/my-video-file2'; // startTimeOffset2 = 3.5; // endTimeOffset2 = 15; // outputUri = 'gs://my-bucket/my-output-folder/'; function calcOffsetNanoSec(offsetValueFractionalSecs) { if (offsetValueFractionalSecs.toString().indexOf('.') !== -1) { return ( 1000000000 * Number('.' + offsetValueFractionalSecs.toString().split('.')[1]) ); } return 0; } const startTimeOffset1Sec = Math.trunc(startTimeOffset1); const startTimeOffset1NanoSec = calcOffsetNanoSec(startTimeOffset1); const endTimeOffset1Sec = Math.trunc(endTimeOffset1); const endTimeOffset1NanoSec = calcOffsetNanoSec(endTimeOffset1); const startTimeOffset2Sec = Math.trunc(startTimeOffset2); const startTimeOffset2NanoSec = calcOffsetNanoSec(startTimeOffset2); const endTimeOffset2Sec = Math.trunc(endTimeOffset2); const endTimeOffset2NanoSec = calcOffsetNanoSec(endTimeOffset2); // Imports the Transcoder library const {TranscoderServiceClient} = require('@google-cloud/video-transcoder').v1; // Instantiates a client const transcoderServiceClient = new TranscoderServiceClient(); async function createJobWithConcatenatedInputs() { // Construct request const request = { parent: transcoderServiceClient.locationPath(projectId, location), job: { outputUri: outputUri, config: { inputs: [ { key: 'input1', uri: inputUri1, }, { key: 'input2', uri: inputUri2, }, ], editList: [ { key: 'atom1', inputs: ['input1'], startTimeOffset: { seconds: startTimeOffset1Sec, nanos: startTimeOffset1NanoSec, }, endTimeOffset: { seconds: endTimeOffset1Sec, nanos: endTimeOffset1NanoSec, }, }, { key: 'atom2', inputs: ['input2'], startTimeOffset: { seconds: startTimeOffset2Sec, nanos: startTimeOffset2NanoSec, }, endTimeOffset: { seconds: endTimeOffset2Sec, nanos: endTimeOffset2NanoSec, }, }, ], elementaryStreams: [ { key: 'video-stream0', videoStream: { h264: { heightPixels: 360, widthPixels: 640, bitrateBps: 550000, frameRate: 60, }, }, }, { key: 'audio-stream0', audioStream: { codec: 'aac', bitrateBps: 64000, }, }, ], muxStreams: [ { key: 'sd', container: 'mp4', elementaryStreams: ['video-stream0', 'audio-stream0'], }, ], }, }, }; // Run request const [response] = await transcoderServiceClient.createJob(request); console.log(`Job: ${response.name}`); } createJobWithConcatenatedInputs(); // [END transcoder_create_job_with_concatenated_inputs] } // node createJobFromStaticOverlay.js <projectId> <location> <inputUri1> <startTimeOffset1> <endTimeOffset1> <inputUri2> <startTimeOffset2> <endTimeOffset2> <outputUri> process.on('unhandledRejection', err => { console.error(err.message); process.exitCode = 1; }); main(...process.argv.slice(2));