Laden...

[erledigt] WinRt: MediaTranscoder: Fehler bei diesem Vorgang, da...

Erstellt von Yeats vor 9 Jahren Letzter Beitrag vor 9 Jahren 3.510 Views
Y
Yeats Themenstarter:in
102 Beiträge seit 2005
vor 9 Jahren
[erledigt] WinRt: MediaTranscoder: Fehler bei diesem Vorgang, da...

Hallo

Bin mal wieder an einem Punkt angekommen wo ich Hilfe benötige.

Diesmal gehts um Audio. Mein Ziel ist es eine Audio-Date am Anfange und am Ende zu beschneiden.
Das ganze soll aber in einer Windows Store App stattfinden. Bibliotheken wie NAudio sind zwar schön, allerdings kommt man damit nicht durch den Certification Process, da NAudio ein Framework nutzt, dass nicht vom Windows Store unterstützt wird (unterstützt wird WASAPI und XAudio2).

Nach einiger Suche hab ich nun etwas gefunden, was scheinbar das tun soll was ich möchte. Mittels MediaTranscoder kann man Video und Audio Files transkodieren und auch trimmen.

Ich habe hier mal eine TestMethode geschrieben.


private async void TestAsync()
        {
            const string inputFilePath = @"Battlelore - Sword's Song - 11 - Starlight Kingdom.mp3";
            const string outputFilePath = @"output.mp3";

            var mp3AudioProfile = MediaEncodingProfile.CreateMp3(AudioEncodingQuality.Medium);

            var file = await KnownFolders.MusicLibrary.GetFileAsync(inputFilePath);
            
            //var properties = await file.GetBasicPropertiesAsync();
            //var size = properties.Size;

            var transcoder = new MediaTranscoder();
            StorageFile outputFile = null;
            var notFound = false;
            try
            {
                var oFile = await KnownFolders.MusicLibrary.GetFileAsync(outputFilePath);
                outputFile = oFile;
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
                notFound = true;
            }
            if (notFound)
                outputFile = await KnownFolders.MusicLibrary.CreateFileAsync(outputFilePath);


            //transcoder.AlwaysReencode = true;
            transcoder.TrimStartTime = new TimeSpan(0, 0, 1, 0);
            transcoder.TrimStopTime = new TimeSpan(0, 0, 1, 0);

            var preparedTranscodeResult = await transcoder.PrepareFileTranscodeAsync(file, outputFile, mp3AudioProfile);
            transcoder.VideoProcessingAlgorithm = MediaVideoProcessingAlgorithm.Default;
            
            if (preparedTranscodeResult.CanTranscode)
            {
                await preparedTranscodeResult.TranscodeAsync();
            }            
        }

Bekomme hier allerdings bei:


await preparedTranscodeResult.TranscodeAsync();

eine System.Exception mit zusätzlicher Information: > Fehlermeldung:

Fehler bei diesem Vorgang, da von der Senke keine Beispiele verarbeitet wurden. (Ausnahme von HRESULT: 0xC00D4A44)

Im Detail:> Fehlermeldung:

System.Exception occurred
_HResult=-1072870844
_message=Fehler bei diesem Vorgang, da von der Senke keine Beispiele verarbeitet wurden. (Ausnahme von HRESULT: 0xC00D4A44)
HResult=-1072870844
IsTransient=false
Message=Fehler bei diesem Vorgang, da von der Senke keine Beispiele verarbeitet wurden. (Ausnahme von HRESULT: 0xC00D4A44)
Source=mscorlib
StackTrace:
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
InnerException:

Hat hier vlt jemand eine Idee was mir fehlt? Ist MediaTranscoder überhaupt in der Lage, Audio Files alleine zu transkodieren?
Habe ich eine Einstellung vergessen oder bin ich einfach nur blöd?

MFG

Y
Yeats Themenstarter:in
102 Beiträge seit 2005
vor 9 Jahren

So wie es aussieht ist das Problem hierbei diese Zuweisung:

transcoder.TrimStartTime = new TimeSpan(0, 0, 1, 0);
transcoder.TrimStopTime = new TimeSpan(0, 0, 1, 0);

Lasse ich diese Zuweisungen weg, kann das TranscodeAsync() den Aufruf verarbeiten. Da ein Versuch mit Trimmen bei Video Dateien funktioniert, dürfte hier wohl bei Audio ein generelles Problem zu sein!?!

Hat sonst vielleicht jemand eine Idee wie ich ein Audio - Datei innerhalb einer StoreApp Trimmen könnte, ohne mir jetzt eine große Interop Wrapper Klasse zu bauen?

Mfg

Y
Yeats Themenstarter:in
102 Beiträge seit 2005
vor 9 Jahren

Hatte nun wieder etwas Zeit mich darum zu kümmern. Mein Ablauf sieht jetzt folgend aus:1.Transcodieren der mp3 in eine Wav-Datei mittels der Transcode Funktion von WinRt 1.Die so erhaltene Wav-Datei öffne ich anschließend als Stream 1.Diesen Stream lese ich vollständig aus und identifiziere dann die einzelnen RIFF Chunks (Header, fmt, junk, Data) 1.Im Data Chunk hab ich dann die Raw-Audio Informationen 1.Trimmen tu ich das ganze dann auf dem Data Chunk. Anschließend berechne ich mir die neue Größe der einzelnen Chunks (in diesem Falle dann eben von Header und Data) 1.Schreibe eine neue Wav-Datei in den Storage 1.Transcodiere dieses dann zurück in eine mp3-Datei 1.Lösche die neu erstellte Wav-Datei

16.807 Beiträge seit 2008
vor 9 Jahren

"async void" ist mit der größte Fehler, den man bei async/await machen kann.
Damit werden Dir Exceptions nur so um die Ohren gehauen, wenn die Calls entsprechend viel werden - vor allem mit dem letzten await.

Es gibt nur ein einzigen Fall, bei dem man async void gutheißen kann - und das sind Eventhandler.
Siehe auch Bewährte Verfahren bei der asynchronen Programmierung

Würde mich nicht wundern, wenn das hier zu Folgefehlern führt.
In ASP.NET würde async void dazu führen, dass ein Request vorzeitig an den User gesendet wird und genau das eine Exception auslöst.

Y
Yeats Themenstarter:in
102 Beiträge seit 2005
vor 9 Jahren

Da auch folgendes zur gleichen Exception führt:


private async Task TranscodeFromMp3ToWav()
{
            const string inputFilePath = @"Battlelore - Sword's Song - 11 - Starlight Kingdom.mp3";
            //const string inputFilePath = @"b8845d32-8875-4469-a610-05758c3bccaf.mp3";

            var file = await KnownFolders.MusicLibrary.GetFileAsync(inputFilePath);

            var profile = MediaEncodingProfile.CreateMp3(AudioEncodingQuality.High);
            var transcoder = new MediaTranscoder();
            var folder = ApplicationData.Current.LocalFolder;
            var outputFile = await folder.CreateFileAsync("output.mp3", CreationCollisionOption.ReplaceExisting);

            transcoder.TrimStartTime = new TimeSpan(0, 0, 1, 0);
            transcoder.TrimStopTime = new TimeSpan(0, 0, 1, 0);

            var transcode = await transcoder.PrepareFileTranscodeAsync(file, outputFile, profile);

            if (transcode.CanTranscode)
            {
                await transcode.TranscodeAsync();
            }
}

Lag der Fehler nicht am async/void.

16.807 Beiträge seit 2008
vor 9 Jahren

Die englische Fehlermeldung lautet> Fehlermeldung:

The operation failed because no samples were processed by the sink

Auf Deutsch zu suchen ist immer recht sinnfrei, da die Suchtreffer nur noch einen Bruchteil betragen.

Vermutlich ist dann das Problem - wenn man die Fehlermeldung wörtlich nimmt - wirklich das Setzen der Timestamps.

Mögliche Ursachen:
* MP3 hat an dieser Stelle keinen Inhalt, weil sie gar nicht so lange (zeitlich) ist.
* Durch die zeitlichen Trims gibt es keinen Inhalt mehr (was bei Deinem Code eintritt, sobald die MP3-Dauer 2 Minuten oder kleiner ist (Du schneidest vorn und hinten je eine Minute ab).
* Die MP3 kann nicht gelesen werden

Y
Yeats Themenstarter:in
102 Beiträge seit 2005
vor 9 Jahren

Dauer der mp3 ist über 4 Minuten, durch das entfernen von jeweils 60 am Anfang und Ende bleiben somit noch gute 2:24Minuten übrig.
Mp3 kann gelesen werde, da sie (lt. ProcessMonitor) auch nicht von einem anderen Prozess geblockt wird.
Befindet sich im genau diesem Ordner und kann vom Programmcode auch via MediaElement abgespielt werden

PS: Sie kann, ohne das Trimmen, in ein anderes Medien Format transcodiert werden. Aber sobald hier beide Properties (transcoder.TrimStartTime und transcoder.TrimStopTime) gesetzt sind, können Samples nicht mehr verarbeitet werden.
PPS: Bei einem anderen Versuch mit einem Video (und entsprechender Umstellung der Encoding Profiles), funktioniert das Trimmen.

F
10.010 Beiträge seit 2004
vor 9 Jahren

Ist das eine MP3 mit fester oder variabler codierung?

Bei vbr sind die wenigsten codierer darauf eingestellt, da dann ja nicht nach "bytepositionen" geucht werden kann.

Y
Yeats Themenstarter:in
102 Beiträge seit 2005
vor 9 Jahren

Mit konstanter Bitrate