Exemples de configuration

Restez organisé à l'aide des collections Enregistrez et classez les contenus selon vos préférences.

Cette page présente des exemples de configuration pour l'encodage d'un fichier multimédia d'entrée (c'est-à-dire un ElementaryStream).

Flux vidéo

Les propriétés VideoStream n'ont pas de dépendances les unes envers les autres. Vous pouvez définir des propriétés telles que la résolution (hauteur et largeur), le débit et la fréquence d'images indépendamment.

{
  "videoStream": {
    "h264": {
      "profile": "high",
      "preset": "veryfast",
      "heightPixels": 360,
      "widthPixels": 640,
      "pixelFormat": "yuv420p",
      "bitrateBps": 550000,
      "rateControlMode": "vbr",
      "crfLevel": 21,
      "vbvSizeBits": 550000,
      "vbvFullnessBits": 495000,
      "gopDuration": "3s",
      "entropyCoder": "cabac",
      "bFrameCount": 3,
      "frameRate": 30,
      "aqStrength": 1
    }
  },
  "key": "video-stream0"
}

Flux audio

Certaines propriétés AudioStream dépendent les unes des autres. La valeur de la propriété channelCount doit être égale au nombre de dispositions dans le tableau channelLayout. Cette valeur doit également correspondre au nombre de canaux dans un flux d'entrée mappé.

Flux audio de base

Voici un exemple de flux audio non mappé et non mixé.

{
  "audioStream": {
    "codec": "aac",
    "bitrateBps": 64000,
    "channelCount": 2,
    "channelLayout": [
      "fl",
      "fr"
    ],
    "sampleRateHertz": 48000
  },
  "key": "audio-stream0"
}

Flux audio avec mise en correspondance

Voici un exemple de flux audio mappé d'entrée. Le signal stéréo AudioStream de sortie est composé des entrées suivantes :

  • Piste 1
    • Canal 0
  • Piste 1
    • Canal 1

Notez que la valeur de la propriété channelCount doit être égale au nombre d'objets défini sous mapping, chacun avec son propre outputChannel.

{
  "key":  "audio-stream0",
  "audioStream": {
    "codec": "aac",
    "bitrateBps": 64000,
    "channelCount": 2,
    "channelLayout": [
      "fl",
      "fr"
    ],
    "sampleRateHertz": 48000,
    "mapping": [
      {
        "atomKey": "atom0",
        "inputKey": "video_and_stereo_audio",
        "inputTrack": 1,
        "inputChannel": 0,
        "outputChannel": 0,
        "gainDb": 0
      },
      {
        "atomKey": "atom0",
        "inputKey": "video_and_stereo_audio",
        "inputTrack": 1,
        "inputChannel": 1,
        "outputChannel": 1,
        "gainDb": 0
      }
    ]
  }
}

Flux audio avec mixage

Voici un exemple de flux audio avec mixage. Le signal stéréo AudioStream de sortie est composé des entrées suivantes :

  • Piste 2
    • Canal 0
    • Canal 2
    • Canal 4
  • Piste 2
    • Canal 1
    • Canal 3
    • Canal 5
{
  "key":  "audio-stream0",
  "audioStream":  {
    "codec":  "aac",
    "bitrateBps":  128000,
    "channelCount":  2,
    "mapping":  [
      {
        "atomKey": "atom0",
        "inputKey": "video_and_stereo_audio",
        "inputTrack": 2,
        "inputChannel": 0,
        "outputChannel": 0,
        "gainDb": 0
      },
      {
        "atomKey": "atom0",
        "inputKey": "video_and_stereo_audio",
        "inputTrack": 2,
        "inputChannel": 2,
        "outputChannel": 0,
        "gainDb": 0
      },
      {
        "atomKey": "atom0",
        "inputKey": "video_and_stereo_audio",
        "inputTrack": 2,
        "inputChannel": 4,
        "outputChannel": 0,
        "gainDb": 0
      },
      {
        "atomKey": "atom0",
        "inputKey": "video_and_stereo_audio",
        "inputTrack": 2,
        "inputChannel": 1,
        "outputChannel": 1,
        "gainDb": 0
      },
      {
        "atomKey": "atom0",
        "inputKey": "video_and_stereo_audio",
        "inputTrack": 2,
        "inputChannel": 3,
        "outputChannel": 1,
        "gainDb": 0
      },
      {
        "atomKey": "atom0",
        "inputKey": "video_and_stereo_audio",
        "inputTrack": 2,
        "inputChannel": 5,
        "outputChannel": 1,
        "gainDb": 0
      }
    ],
    "sampleRateHertz":  44100
  }
}

Flux de texte

Les propriétés TextStream n'ont pas de dépendances les unes envers les autres. Vous pouvez définir les propriétés indépendamment.

Les flux de texte peuvent utiliser une liste d'édition pour modifier le fichier de sortie. Les sections suivantes mettent en évidence l'utilisation de la liste d'édition pour fournir des sous-titres.

L'exemple suivant montre un flux de texte avec un élément atom dans la liste d'édition.

{
  "editList":[
     {
        "key":"atom0",
        "inputs":[
           "video_input0",
           "caption_input0"
        ],
        "startTimeOffset":"0s",
        "endTimeOffset":"300s"
     }
  ],
  "elementaryStreams":[
    {
      "key": "cea-stream0",
      "textStream": {
        "codec": "cea708",
        "mapping": [
          {
            "atomKey": "atom0",
            "inputKey": "caption_input0",
            "inputTrack": 0
          }
        ]
      }
    }
  ]
}

L'exemple suivant montre un flux de texte avec deux éléments atom dans la liste d'édition.

{
  "editList":[
     {
        "key":"atom0",
        "inputs":[
           "video_input0",
           "caption_input0"
        ],
        "startTimeOffset":"0s",
        "endTimeOffset":"300s"
     },
     {
        "key":"atom1",
        "inputs":[
           "video_input1",
           "caption_input1"
        ],
        "startTimeOffset":"0s",
        "endTimeOffset":"300s"
     }
  ],
  "elementaryStreams":[
    {
      "key": "cea-stream0",
      "textStream": {
        "codec": "cea708",
        "mapping": [
          {
          "atomKey": "atom0",
          "inputKey": "caption_input0",
          "inputTrack": 0
          },
          {
          "atomKey": "atom1",
          "inputKey": "caption_input1",
          "inputTrack": 0
          }
        ]
      }
    }
  ]
}

Avancé

Les sections suivantes décrivent diverses configurations avancées.

Sortie audio uniquement

La configuration suivante génère des fichiers MP4 et TS audio uniquement.

{
  "config": {
    "inputs": [
      {
        "key": "input0",
        "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_INPUT_VIDEO"
      }
    ],
    "elementaryStreams": [
      {
        "key": "audio-stream0",
        "audioStream": {
          "codec": "aac",
          "bitrateBps": 64000
        }
      }
    ],
    "muxStreams": [
      {
        "key": "audio-only-ts",
        "fileName": "audio-only.ts",
        "container": "ts",
        "elementaryStreams": [
          "audio-stream0"
        ]
      },
      {
        "key": "audio-only-mp4",
        "fileName": "audio-only.mp4",
        "container": "mp4",
        "elementaryStreams": [
          "audio-stream0"
        ]
      }
    ],
    "manifests": [
    {
      "fileName": "manifest.m3u8",
      "type": "HLS",
      "muxStreams": [
        "audio-only-ts"
      ]
    }
    ],
    "output": {
      "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_OUTPUT_FOLDER/"
    }
  }
}

MuxStream et fmp4

Un MuxStream qui utilise le conteneur fmp4 ne peut contenir qu'un seul flux ElementaryStream. Pour ce conteneur, utilisez deux flux MuxStreams : un pour l'audio et un pour la vidéo :

"muxStreams":[
  {
    "key": "hd3-video",
    "container": "fmp4",
    "elementaryStreams":["video-stream1"]
  },
  {
    "key": "hd3-audio",
    "container": "fmp4",
    "elementaryStreams":["audio-stream1"]
  }
],

Réutiliser des flux dans plusieurs fichiers manifestes

L'exemple de configuration suivant montre deux encodages vidéo et un encodage audio utilisés dans les fichiers manifestes HLS et DASH :

{
  "config": {
    "inputs": [
      {
        "key": "input0",
        "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_INPUT_VIDEO"
      }
    ],
    "elementaryStreams": [
      {
        "videoStream": {
          "h264": {
            "heightPixels": 360,
            "widthPixels": 640,
            "bitrateBps": 500000,
            "frameRate": 30
          }
        },
        "key": "video-stream0"
      },
      {
        "videoStream": {
          "h264": {
            "heightPixels": 720,
            "widthPixels": 1280,
            "bitrateBps": 3200000,
            "frameRate": 30
          }
        },
        "key": "video-stream1"
      },
      {
        "audioStream": {
          "codec": "aac",
          "bitrateBps": 64000,
          "sampleRateHertz": 48000
        },
        "key": "audio-stream0"
      }
    ],
    "muxStreams": [
      {
        "key": "video-only-sd",
        "container": "fmp4",
        "elementaryStreams": [
          "video-stream0"
        ]
      },
      {
        "key": "video-only-hd",
        "container": "fmp4",
        "elementaryStreams": [
          "video-stream1"
        ]
      },
      {
        "key": "audio-only",
        "container": "fmp4",
        "elementaryStreams": [
          "audio-stream0"
        ]
      }
    ],
    "manifests": [
      {
        "fileName": "manifest.m3u8",
        "type": "HLS",
        "muxStreams": [
          "video-only-sd",
          "video-only-hd",
          "audio-only"
        ]
      },
      {
        "fileName": "manifest.mpd",
        "type": "DASH",
        "muxStreams": [
          "video-only-sd",
          "video-only-hd",
          "audio-only"
        ]
      }
    ],
    "output": {
      "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_OUTPUT_FOLDER/"
    }
  }
}

Paramètres recommandés pour le transcodage de plusieurs profils

Pour la résolution de sortie et le débit, en fonction de la résolution d'entrée/de la fréquence d'images (50/60 FPS), ajoutez l'étape de fréquence d'images la plus élevée pour 50/60 FPS, le cas échéant. Notez que l'ajout d'étapes supplémentaires nécessite davantage de puissance de calcul. L'échelle recommandée est la suivante:

Résolution (ScanMode)/Fréquence d'images Débit de haut niveau H.264 (Kbits/s)
170x96 p12/15 130
256x144 p25/30 240
416x234 p25/30 300
640x360 p25/30 400
768x432 p25/30 750
768x432 p25/30 1100
960x540 p25/30 2200
1280x720 p25/30 3300
1280x720 p50/60 5500
1920x1080 p25/30 6 000
1920x1080 p50/60 9000

Pour les contenus audio, les recommandations sont basées sur le nombre de chaînes:

Canaux Débit AAC (kbit/s)
2.0 64
2.0 160
5,1 384

Cette échelle vous permet de créer une configuration qui génère des fichiers manifestes HLS et MPEG-DASH avec différentes combinaisons:

{
  "config": {
    "inputs": [
        {
          "key": "input0",
          "uri": "gs://my-bucket/input0.mp4"
        }
      ],
    "elementaryStreams": [
      {
        "key": "video-stream0",
        "videoStream": {
          "h264": {
            "heightPixels": 96,
            "widthPixels": 170,
            "bitrateBps": 130000,
            "frameRate": 15,
            "gopDuration": "4.0s",
            "pixelFormat": "yuv420p",
            "rateControlMode": "crf",
            "crfLevel": 10,
            "bFrameCount": 3,
            "profile": "high",
            "enableTwoPass": true,
            "preset": "medium"
          }
        }
      },
      {
        "key": "video-stream1",
        "videoStream": {
          "h264": {
            "heightPixels": 144,
            "widthPixels": 256,
            "bitrateBps": 240000,
            "frameRate": 30,
            "gopDuration": "4.0s",
            "pixelFormat": "yuv420p",
            "rateControlMode": "crf",
            "crfLevel": 10,
            "bFrameCount": 3,
            "profile": "high",
            "enableTwoPass": true,
            "preset": "medium"
          }
        }
      },
      {
        "key": "video-stream2",
        "videoStream": {
          "h264": {
            "heightPixels": 234,
            "widthPixels": 416,
            "bitrateBps": 300000,
            "frameRate": 30,
            "gopDuration": "4.0s",
            "pixelFormat": "yuv420p",
            "rateControlMode": "crf",
            "crfLevel": 10,
            "bFrameCount": 3,
            "profile": "high",
            "enableTwoPass": true,
            "preset": "medium"
          }
        }
      },
      {
        "key": "video-stream3",
        "videoStream": {
          "h264": {
            "heightPixels": 360,
            "widthPixels": 640,
            "bitrateBps": 400000,
            "frameRate": 30,
            "gopDuration": "4.0s",
            "pixelFormat": "yuv420p",
            "rateControlMode": "crf",
            "crfLevel": 10,
            "bFrameCount": 3,
            "profile": "high",
            "enableTwoPass": true,
            "preset": "medium"
          }
        }
      },
      {
        "key": "video-stream4",
        "videoStream": {
          "h264": {
            "heightPixels": 432,
            "widthPixels": 768,
            "bitrateBps": 1100000,
            "frameRate": 30,
            "gopDuration": "4.0s",
            "pixelFormat": "yuv420p",
            "rateControlMode": "crf",
            "crfLevel": 10,
            "bFrameCount": 3,
            "profile": "high",
            "enableTwoPass": true,
            "preset": "medium"
          }
        }
      },
      {
        "key": "video-stream5",
        "videoStream": {
          "h264": {
            "heightPixels": 540,
            "widthPixels": 960,
            "bitrateBps": 2200000,
            "frameRate": 30,
            "gopDuration": "4.0s",
            "pixelFormat": "yuv420p",
            "rateControlMode": "crf",
            "crfLevel": 10,
            "bFrameCount": 3,
            "profile": "high",
            "enableTwoPass": true,
            "preset": "medium"
          }
        }
      },
      {
        "key": "video-stream6",
        "videoStream": {
          "h264": {
            "heightPixels": 720,
            "widthPixels": 1280,
            "bitrateBps": 3300000,
            "frameRate": 30,
            "gopDuration": "4.0s",
            "pixelFormat": "yuv420p",
            "rateControlMode": "crf",
            "crfLevel": 10,
            "bFrameCount": 3,
            "profile": "high",
            "enableTwoPass": true,
            "preset": "medium"
          }
        }
      },
      {
        "key": "video-stream7",
        "videoStream": {
          "h264": {
            "heightPixels": 720,
            "widthPixels": 1280,
            "bitrateBps": 5500000,
            "frameRate": 60,
            "gopDuration": "4.0s",
            "pixelFormat": "yuv420p",
            "rateControlMode": "crf",
            "crfLevel": 10,
            "bFrameCount": 6,
            "profile": "high",
            "enableTwoPass": true,
            "preset": "medium"
          }
        }
      },
      {
        "key": "video-stream8",
        "videoStream": {
          "h264": {
            "heightPixels": 1080,
            "widthPixels": 1920,
            "bitrateBps": 6000000,
            "frameRate": 30,
            "gopDuration": "4.0s",
            "pixelFormat": "yuv420p",
            "rateControlMode": "crf",
            "crfLevel": 10,
            "bFrameCount": 3,
            "profile": "high",
            "enableTwoPass": true,
            "preset": "medium"
          }
        }
      },
      {
        "key": "video-stream9",
        "videoStream": {
          "h264": {
            "heightPixels": 1080,
            "widthPixels": 1920,
            "bitrateBps": 9000000,
            "frameRate": 60,
            "gopDuration": "4.0s",
            "pixelFormat": "yuv420p",
            "rateControlMode": "crf",
            "crfLevel": 10,
            "bFrameCount": 6,
            "profile": "high",
            "enableTwoPass": true,
            "preset": "medium"
          }
        }
      },
      {
        "key": "audio-stream0",
        "audioStream": {
          "codec": "aac",
          "bitrateBps": 32000
        }
      },
      {
        "key": "audio-stream1",
        "audioStream": {
          "codec": "aac",
          "bitrateBps": 64000
        }
      },
      {
        "key": "audio-stream2",
        "audioStream": {
          "codec": "aac",
          "bitrateBps": 96000
        }
      },
      {
        "key": "audio-stream3",
        "audioStream": {
          "codec": "aac",
          "bitrateBps": 128000
        }
      },
      {
        "key": "audio-stream4",
        "audioStream": {
          "codec": "aac-he",
          "bitrateBps": 160000
        }
      },
      {
        "key": "audio-stream5",
        "audioStream": {
          "codec": "aac-he-v2",
          "bitrateBps": 384000
        }
      }
    ],
    "muxStreams": [
      {
        "key": "1",
        "container": "ts",
        "elementaryStreams": [
          "video-stream0",
          "audio-stream0"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "2",
        "container": "ts",
        "elementaryStreams": [
          "video-stream1",
          "audio-stream0"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "3",
        "container": "ts",
        "elementaryStreams": [
          "video-stream2",
          "audio-stream1"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "4",
        "container": "ts",
        "elementaryStreams": [
          "video-stream3",
          "audio-stream1"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "5",
        "container": "ts",
        "elementaryStreams": [
          "video-stream4",
          "audio-stream2"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "6",
        "container": "ts",
        "elementaryStreams": [
          "video-stream5",
          "audio-stream3"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "7",
        "container": "ts",
        "elementaryStreams": [
          "video-stream6",
          "audio-stream3"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "8",
        "container": "ts",
        "elementaryStreams": [
          "video-stream7",
          "audio-stream4"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "9",
        "container": "ts",
        "elementaryStreams": [
          "video-stream8",
          "audio-stream4"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "10",
        "container": "ts",
        "elementaryStreams": [
          "video-stream9",
          "audio-stream5"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "video-1",
        "container": "fmp4",
        "elementaryStreams": [
          "video-stream0"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "video-2",
        "container": "fmp4",
        "elementaryStreams": [
          "video-stream1"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "video-3",
        "container": "fmp4",
        "elementaryStreams": [
          "video-stream2"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "video-4",
        "container": "fmp4",
        "elementaryStreams": [
          "video-stream3"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "video-5",
        "container": "fmp4",
        "elementaryStreams": [
          "video-stream4"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "video-6",
        "container": "fmp4",
        "elementaryStreams": [
          "video-stream5"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "video-7",
        "container": "fmp4",
        "elementaryStreams": [
          "video-stream6"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "video-8",
        "container": "fmp4",
        "elementaryStreams": [
          "video-stream7"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "video-9",
        "container": "fmp4",
        "elementaryStreams": [
          "video-stream8"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "video-10",
        "container": "fmp4",
        "elementaryStreams": [
          "video-stream9"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "audio-1",
        "container": "fmp4",
        "elementaryStreams": [
          "audio-stream0"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "audio-2",
        "container": "fmp4",
        "elementaryStreams": [
          "audio-stream1"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "audio-3",
        "container": "fmp4",
        "elementaryStreams": [
          "audio-stream2"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "audio-4",
        "container": "fmp4",
        "elementaryStreams": [
          "audio-stream3"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "audio-5",
        "container": "fmp4",
        "elementaryStreams": [
          "audio-stream4"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      },
      {
        "key": "audio-6",
        "container": "fmp4",
        "elementaryStreams": [
          "audio-stream5"
        ],
        "segmentSettings": {
            "segmentDuration": "4.0s",
            "individualSegments": true
        }
      }
    ],
    "manifests": [
        {
          "fileName": "manifest.m3u8",
          "type": "HLS",
          "muxStreams": [
            "10",
            "9",
            "8",
            "7",
            "6",
            "5",
            "4",
            "3",
            "2",
            "1"
          ]
        },
        {
          "fileName": "manifest.mpd",
          "type": "DASH",
          "muxStreams": [
            "video-10",
            "video-9",
            "video-8",
            "video-7",
            "video-6",
            "video-5",
            "video-4",
            "video-3",
            "video-2",
            "video-1",
            "audio-6",
            "audio-5",
            "audio-4",
            "audio-3",
            "audio-2",
            "audio-1"
          ]
        }
      ],
      "output": {
        "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_OUTPUT_FOLDER/"
      }
  }
}