Jak kódovat pomocí vlastní transformace – .NET
hledáte dokumentaci k Media Services v2?
Při kódování pomocí Azure Media Services můžete rychle začít s jedním z doporučených integrovaných přednastavení na základě doporučených osvědčených postupů, jak je znázorněno v kurzu streamování souborů . Můžete také vytvořit vlastní předvolby, která bude cílit na konkrétní scénář nebo požadavky na zařízení.
Požadavky
Při vytváření vlastních přednastavení platí následující požadavky:
- Všechny hodnoty pro výšku a šířku v obsahu AVC musí být násobkem 4.
- V Azure Media Services V3 jsou všechny přenosové rychlosti kódování v bitech za sekundu. To se liší od přednastavení s našimi rozhraními API v2, která jako jednotku používala kilobity za sekundu. Pokud je například přenosová rychlost v v2 zadaná jako 128 (kilobit/s), ve verzi V3 by se nastavila na 128000 (bity za sekundu).
Požadavky
Stažení ukázky
Naklonujte úložiště GitHub, které obsahuje úplný vzorek .NET Core pro váš počítač, pomocí následujícího příkazu:
git clone https://github.com/Azure-Samples/media-services-v3-dotnet.git
Ukázka vlastní předvolby se nachází v kódování s vlastní předvolbu pomocí složky .NET .
Vytvoření transformace pomocí vlastní předvolby
Když vytváříte novou transformaci, je potřeba určit, co má vytvořit jako výstup. Objekt TransformOutput v níže uvedeném kódu je povinný parametr. Každý objekt TransformOutput obsahuje Předvolbu. Přednastavení popisuje podrobné pokyny k operacím zpracování videa nebo zvuku, které se mají použít ke generování požadovaných TransformOutput. Následující TransformOutput vytvoří vlastní kodek a výstupní nastavení vrstvy.
Než začnete vytvářet transformaci, ověřte si nejdřív pomocí metody Get, jestli už neexistuje (viz kód níže). V Media Services V3 vrátí metody Get v entitách hodnotu null , pokud entita neexistuje (u názvu se nerozlišuje malá a velká písmena).
Ukázka vlastní transformace
Následující příklad definuje sadu výstupů, které chceme vygenerovat při použití této transformace. Nejprve přidáme AacAudio vrstvu pro kódování zvuku a dvě vrstvy H264Video pro kódování videa. Ve vrstvách videa přiřadíme popisky, aby je bylo možné použít v názvech výstupních souborů. Dále chceme, aby výstup zahrnoval také miniatury. V následujícím příkladu určíme obrázky ve formátu PNG, které se generují při 50 % rozlišení vstupního videa a se třemi časovými razítky – {25 %, 50 %, 75 % } délky vstupního videa. Nakonec určíme formát výstupních souborů – jeden pro video + zvuk a druhý pro miniatury. Vzhledem k tomu, že máme více vrstev H264Layer, musíme použít makra, která vytvářejí jedinečné názvy pro každou vrstvu. Můžeme použít buď makro {Label} nebo , příklad ukazuje {Bitrate} první.
/// <summary>
/// If the specified transform exists, return that transform. If the it does not
/// exist, creates a new transform with the specified output. In this case, the
/// output is set to encode a video using a custom preset.
/// </summary>
/// <param name="client">The Media Services client.</param>
/// <param name="resourceGroupName">The name of the resource group within the Azure subscription.</param>
/// <param name="accountName"> The Media Services account name.</param>
/// <param name="transformName">The transform name.</param>
/// <returns></returns>
private static async Task<Transform> CreateCustomTransform(IAzureMediaServicesClient client, string resourceGroupName, string accountName, string transformName)
{
Console.WriteLine("Creating a custom transform...");
// Create a new Transform Outputs array - this defines the set of outputs for the Transform
TransformOutput[] outputs = new TransformOutput[]
{
// Create a new TransformOutput with a custom Standard Encoder Preset
// This demonstrates how to create custom codec and layer output settings
new TransformOutput(
new StandardEncoderPreset(
codecs: new Codec[]
{
// Add an AAC Audio layer for the audio encoding
new AacAudio(
channels: 2,
samplingRate: 48000,
bitrate: 128000,
profile: AacAudioProfile.AacLc
),
// Next, add a H264Video for the video encoding
new H264Video (
// Set the GOP interval to 2 seconds for all H264Layers
keyFrameInterval:TimeSpan.FromSeconds(2),
// Add H264Layers. Assign a label that you can use for the output filename
layers: new H264Layer[]
{
new H264Layer (
bitrate: 3600000, // Units are in bits per second and not kbps or Mbps - 3.6 Mbps or 3,600 kbps
width: "1280",
height: "720",
label: "HD-3600kbps" // This label is used to modify the file name in the output formats
),
new H264Layer (
bitrate: 1600000, // Units are in bits per second and not kbps or Mbps - 1.6 Mbps or 1600 kbps
width: "960",
height: "540",
label: "SD-1600kbps" // This label is used to modify the file name in the output formats
),
new H264Layer (
bitrate: 600000, // Units are in bits per second and not kbps or Mbps - 0.6 Mbps or 600 kbps
width: "640",
height: "360",
label: "SD-600kbps" // This label is used to modify the file name in the output formats
),
}
),
// Also generate a set of PNG thumbnails
new PngImage(
start: "25%",
step: "25%",
range: "80%",
layers: new PngLayer[]{
new PngLayer(
width: "50%",
height: "50%"
)
}
)
},
// Specify the format for the output files - one for video+audio, and another for the thumbnails
formats: new Format[]
{
// Mux the H.264 video and AAC audio into MP4 files, using basename, label, bitrate and extension macros
// Note that since you have multiple H264Layers defined above, you have to use a macro that produces unique names per H264Layer
// Either {Label} or {Bitrate} should suffice
new Mp4Format(
filenamePattern:"Video-{Basename}-{Label}-{Bitrate}{Extension}"
),
new PngFormat(
filenamePattern:"Thumbnail-{Basename}-{Index}{Extension}"
)
}
),
onError: OnErrorType.StopProcessingJob,
relativePriority: Priority.Normal
)
};
string description = "A simple custom encoding transform with 2 MP4 bitrates";
// Does a Transform already exist with the desired name? This method will just overwrite (Update) the Transform if it exists already.
// In production code, you may want to be cautious about that. It really depends on your scenario.
Transform transform = await client.Transforms.CreateOrUpdateAsync(resourceGroupName, accountName, transformName, outputs, description);
return transform;
}