C# FFMPEG czas plików MP4

0

Jak poprawnie policzyć SUMĘ czasu plików MP4? Łindołs to robi i nie ma problemów. 🙁

 private void SummarizeMP4Duration(string folderPath)
        {
            try
            {
                string[] mp4Files = Directory.GetFiles(folderPath, "*.mp4");

                TimeSpan totalDuration = TimeSpan.Zero;

                foreach (string mp4File in mp4Files)
                {
                    totalDuration += GetDurationWithFFmpeg(mp4File);
                }

                richTextBox1.AppendText("Czas trwania wszystkich plików MP4: " + totalDuration.ToString(@"hh\:mm\:ss") + Environment.NewLine);
            }
            catch (Exception ex)
            {
                richTextBox1.AppendText("Błąd podczas obliczania czasu trwania plików MP4: " + ex.Message + Environment.NewLine);
            }
        }

        private unsafe TimeSpan GetDurationWithFFmpeg(string filePath)
        {
            AVFormatContext* formatContextPtr = null;
            try
            {
                ffmpeg.avformat_network_init(); // Inicjalizacja biblioteki FFmpeg

                // Otwieranie pliku wideo
                if (ffmpeg.avformat_open_input(&formatContextPtr, filePath, null, null) != 0)
                {
                    throw new InvalidOperationException("Nie można otworzyć pliku wideo.");
                }

                // Pobieranie informacji o strumieniach w pliku wideo
                if (ffmpeg.avformat_find_stream_info(formatContextPtr, null) < 0)
                {
                    throw new InvalidOperationException("Nie można znaleźć informacji o strumieniach w pliku wideo.");
                }

                // Obliczanie czasu trwania
                var duration = formatContextPtr->duration * ffmpeg.av_q2d(ffmpeg.av_get_time_base_q());
                return TimeSpan.FromSeconds(duration);
            }
            catch (Exception ex)
            {
                richTextBox1.AppendText("Błąd podczas uzyskiwania czasu trwania pliku MP4 za pomocą FFmpeg: " + ex.Message + Environment.NewLine);
                return TimeSpan.Zero;
            }
            finally
            {
                // Zwolnienie zasobów po zakończeniu pracy
                if (formatContextPtr != null)
                {
                    ffmpeg.avformat_close_input(&formatContextPtr);
                    ffmpeg.avformat_free_context(formatContextPtr);
                }
            }
        }

U mnie jest od razu błąd, że Błąd podczas uzyskiwania czasu trwania pliku MP4 za pomocą FFmpeg: Określona metoda nie jest obsługiwana.

Więc jak to zrobić?
Oczekuję wyniki jak w łindołsie.

screenshot-20240413084617.png

1

Jest tak ponieważ robisz to nie poprawnie. Po pierwsze debugerem sprawdź na której metodzie leci ci błąd. Ale jeszcze wcześniej sprawdź czy moduł jest poprawnie zainicjowany avformat_network_init zwraca inta który coś oznacza, a ty jeb będzie dobrze bo wywołałem se metodke.

0

JAK na której skoro CATCH wywala... to na ffmpeg.avformat_network_init(); // Inicjalizacja biblioteki FFmpeg
Tu wywala

1

Jest coś takiego jak call stack i tam sprawdzasz po kolei ścieżkę exceptiona.
A skoro leci ci na init to tak jak pisałem odczytaj kod i sprawdź co on oznacza, a później googlaj rozwiązanie może ktoś już miał taki problem. Choć podejrzewam że nie masz jakichś bianrek dołączonych do apki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1