Koda med en anpassad transformering – .NET
Letar du efter Media Services v2-dokumentation?
När du kodar med Azure Media Services kan du snabbt komma igång med någon av de rekommenderade inbyggda förinställningarna baserat på branschens bästa praxis som visas i självstudien om direktuppspelningsfiler. Du kan också skapa en anpassad förinställning som riktar in sig på ditt specifika scenario eller dina enhetskrav.
Överväganden
När du skapar anpassade förinställningar gäller följande:
- Alla värden för höjd och bredd i AVC-innehåll måste vara en multipel av 4.
- I Azure Media Services v3 är alla kodningsbithastigheter i bitar per sekund. Detta skiljer sig från förinställningarna med våra v2 API:er, som använde kilobitar/sekund som enhet. Om bithastighet i v2 till exempel angavs som 128 (kilobitar/sekund) i v3 skulle den vara inställd på 128 000 (bitar/sekund).
Förutsättningar
Skapa ett Media Services-konto
Ladda ned exemplet
Klona en GitHub-lagringsplats som innehåller det fullständiga .NET Core-exemplet till datorn med följande kommando:
git clone https://github.com/Azure-Samples/media-services-v3-dotnet.git
Det anpassade förinställda exemplet finns i Encoding med en anpassad förinställning med hjälp av .NET-mappen.
Skapa en transformering med en anpassad förinställning
När du skapar en nytransformering måste du ange vad du vill att den ska producera som utdata. Den obligatoriska parametern är objektet TransformOutput som visas i koden nedan. Varje TransformOutput innehåller en Förinställning. Förinställningen beskriver de stegvisa instruktionerna för video- och/eller ljudbearbetningsåtgärder som ska användas för att generera önskad TransformOutput. Följande TransformOutput skapar anpassade codec- och layer output-inställningar.
När du skapar en Transformering bör du först kontrollera om det redan finns en. Det gör du med metoden Get som visas i koden nedan. I Media Services v3 returnerar Hämta metoder på entiteter null om entiteten inte finns (en okänslig kontroll av namnet).
Exempel på anpassad transformering
I följande exempel definieras en uppsättning utdata som vi vill ska genereras när den här transformeringen används. Först lägger vi till ett AacAudio-lager för ljudkodningen och två H264Video-lager för videokodningen. I videoskikten tilldelar vi etiketter så att de kan användas i utdatafilnamnen. Därefter vill vi att utdata även ska innehålla miniatyrbilder. I exemplet nedan anger vi bilder i PNG-format, genererade med 50 % av upplösningen för indatavideon och vid tre tidsstämplar – {25 %, 50 %, 75 %} av längden på indatavideon. Slutligen anger vi formatet för utdatafilerna – en för video + ljud och en annan för miniatyrbilderna. Eftersom vi har flera H264Layers måste vi använda makron som producerar unika namn per lager. Vi kan antingen använda {Label} ett - {Bitrate} eller -makro. Exemplet visar det första.
/// <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;
}