FFMPEG wykonuje sam kompresje plików video, dla nie których działań?

0

Tak jak w temacie

Jak wyłączyć w FFMPEG jego własną chamską kompresje plików, która nie wynika z kodu programu. Dzieje się to na etapie łączenia plików (jako pierwsze zadanie) lub stabilizacji plików (jako pierwsze zadanie). Tracę na jakości plików poprzez zmniejszenie się nawet z 16k do 7k birate plików (w częściach) wejściowych.

Jak więc bez strat mam połączyć pliki czy dokonywać na nich stabilizacji, aby ich birate się nie zmieniał?
Dodam, że efekt nie dotyka każdego filmu - tylko większości. Nie które wychodzą z pojedynku cało i np. na wejściowe 16,2k birate mają wyjściowe 16k birate.. Co nie jest żadną widoczną stratą.

Lecz strata z 16k do 7k jest już widoczna na szczegółowości i szczególnie filmach kręconych w nocy i w złym świetle.

Załączam kod wrappera c#:

 try
            {
             

                temporalny = "Megazord" + idak + ".trf";
                temporalny2 = "Terazord" + idak + ".trf";
               
                 converter = new FFMpegConverter(); 
                 poEtapie1 = d + idak + "_Stab_PoEtapie1.mp4";
                 poEtapie2 = d + idak + "_Stab_PoEtapie2.mp4";
                 po2Etapie1 = d + idak + "_Stab_Po_DRUGIM_Etapie1.mp4";
                 po2Etapie2 = d + idak + "_Stab_Po_DRUGIM_Etapie2.mp4";
                smartLog("Rownostab (plik " + s + ") wywoluje pierwszy etap - wektorowanie. Po nim bedzie nazywac sie " + poEtapie1 + " a plik jego wektorow to " + temporalny + "! ");
                converter.ConvertMedia(s,
                    null, // autodetect by input file extension 
                    poEtapie1,
                    null, // autodetect by output file extension 
                    new NReco.VideoConverter.ConvertSettings()
                    {
                        
                              CustomOutputArgs = " -vf vidstabdetect=stepsize=6:shakiness=8:accuracy=9:result="+temporalny+" -f null -"
                
                    }
               );
            

                            }
            catch(Exception ex)
            {
                smartLog("Rownostab [etap 1]  wysypal sie na " + ex.Message + " i stacktrace " + ex.StackTrace + " .");
                return;
            }

Taka sama sytuacja ma miejsce, jeżeli pierwszym zadaniem jest łączenie plików:

 try
                {
                    // juz juz juz

                    smartLog("Zaczynam etap Laczenie plikow.");
                    labelAktualneZadanie.Invoke(new Action(() =>
                    {

                        labelAktualneZadanie.Text = "Łączenie plików";
                    }));
                    string newvid = deepDir + "Polaczone.mp4";
                    lastOutputName = newvid;
                    smieci.Add(lastOutputName);
                    smartLog("LastOutputName = " + lastOutputName);
                    converter.ConcatMedia(movies, newvid, Format.mp4, set);
                    smartLog("Zakonczylem etap Laczenie plikow.");

                }
                catch (Exception ex)
                {
                    smartLog("Etap łączenie plików - nastepil wyjatek o tresci " + ex.Message + " i stacktrace " + ex.StackTrace + " .");

                    Console.Write("Blad ffmpeg? " + ex.Message);
                    MessageBox.Show(ex.Message);
                }

Pomoże ktoś?? :(((

0

Pokaż może nie kod ale docelowe wywołanie ffmpeg (parametry).

Żeby mieć dobrą jakość trzeba ustawić wyjściowy kodek i jego parametry. Nie polegać na domyślnych ustawieniach ffmpeg.

0

w custom arguments jest, każde z nich wykonuje jeden plik wyjściowy

0

i co pomoże ktoś??

0

No to może pobierz informacje z pliku wejściowego(tego który chcesz przetwarzać) no a potem w argumentach użyj tych wartości

Do wydobycia z pliku potrzebnych informacji możesz użyć FFProbe. Tu coś o tym jest
https://stackoverflow.com/questions/37134805/how-to-access-video-file-info-in-c-sharp

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