Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   mp4 Cut and Merge (https://www.delphipraxis.net/184289-mp4-cut-merge.html)

nezumi7 15. Mär 2015 16:10


mp4 Cut and Merge
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi

ich habe mich mal an einem Programm versucht, mit dem man mp4 Video-Dateien verlustfrei schneiden und wieder zusammenfügen kann (mit ffmpeg oder mp4box). Für mp4box gibts entsprechende GUIs zwar schon (Yamp, Mymp4 GUI), bei denen gefällt mir aber nicht so recht, dass es keine Vorschau gibt und man die Zeiten manuell eingeben muss. Mir ist schon klar dass z.B. avidemux das auch kann (und noch viel mehr), ich wollte es aber mal selbst probieren, außerdem sind mir die professionellen Programme dann auch irgendwie zu überladen.

Wenn Ihr mit dem Prog schneiden wollt, muss mindestens ffprobe.exe mit im Verzeichnis liegen und dann noch (je nachdem mit was Ihr schneiden wollt) entweder ffmpeg.exe oder mp4box.exe + js32.dll. (Wenn Ihr das Prog einfach nur mal anschauen wollt, gehts auch ohne sonstige Dateien, dann funktioniert aber nur der Player und alle Bearbeitungsfunktionen sind disabled).

Als primärer Linux-User hab ichs hauptsächlich mit Win XP getestet. Unter späteren Windows Versionen sollte es auch gehen (für 64-bit systeme braucht Ihr die 64-bit Versionen von ffprobe und ffmpeg), Sorgen machen mir da aber die Administratorenrechte. Ich kenn mich da nicht so aus, habe aber versucht, alle denkbaren Fehler durch sinnvolle Medungen abzufangen...


Au weia Leute, seid gnädig mit Euerm Urteil. Ich mach beruflich was ganz anderes und bin eher so der Hobby Programmierer mit doch sehr übersichtlichen Kenntnissen..... :roll:

Greetings,
Stephan.

PS: Prog legt im Stammverzeichnis eine ini-Datei an und in dem Verzeichnis, aus dem Ihr das Video ladet einen temporären Ordner "~temp\" (wenn Ihr kein anderes Verzeichnis angebt).

hathor 15. Mär 2015 17:19

AW: mp4 Cut and Merge
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn's funktionieren würde...

Warum erscheint bei jedem Fehler ein Fenster?
Das nervt total!

nezumi7 15. Mär 2015 17:53

AW: mp4 Cut and Merge
 
hmmm, komisch. Den Fehler hatte ich noch nie.

Ist das Video eine mp4 Datei?

hathor 15. Mär 2015 18:07

AW: mp4 Cut and Merge
 
Liste der Anhänge anzeigen (Anzahl: 1)
MediaInfo:

nezumi7 15. Mär 2015 18:19

AW: mp4 Cut and Merge
 
Ich hatte vergessen eine Variable zu initialisieren. Das ist jetzt korrigiert.

Die Fehlermeldung kommt aber eigentlich nur, wenn weder der Player noch ffprobe die Datei als Video erkennt.

Hast Du ffprobe.exe im Verzeichnis?

hathor 15. Mär 2015 19:38

AW: mp4 Cut and Merge
 
Liste der Anhänge anzeigen (Anzahl: 1)
Dir:

nezumi7 17. Mär 2015 05:57

AW: mp4 Cut and Merge
 
Scheint ein Codec Problem zu sein. Habe bei mir das K-Lite-Codec Pack installiert. Damit funktionierts bestens.

Läuft das Video denn sonst bei Dir?

hathor 17. Mär 2015 06:54

AW: mp4 Cut and Merge
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das Video läuft mit VLC, DVDFabMediaPlayer, WINDOWS-Media-Player8.1, ZoomPlayer, MediaPlayerClassic.

Nachtrag:
Ich habe jetzt das obengenannte Paket installiert.
Von hier: http://downloads.ddigest.com/softwar...d=5&rid=178216

Jetzt sieht man das Video. Die LAV-Decoder werden geladen.

hathor 19. Mär 2015 22:14

AW: mp4 Cut and Merge
 
Hallo Stephan,

hast Du die Absicht, das Programm noch weiter zu entwickeln?
Sonst pack doch bitte den bisher geschriebenen Sourcecode als Anhang in den Thread.
Ich hätte Interesse an einem Programm, das mir TV-Sendungen (TS-Files) bearbeitet: Anfang, Ende, Werbung entfernen.
TAGs: cutter, joiner, alidvr

nezumi7 21. Mär 2015 08:00

AW: mp4 Cut and Merge
 
den Quellcode werde ich erst mal bereinigen, da ich da selbst kaum noch durchblicke. 90% davon ist aber auch reine Fleißarbeit (Optik, Hinweise usw.) und daher nicht wirklich interessant.

Für die Videoanzeige hab ich DSPack genommen. Der relevante Code für Video-Infos auslesen und fürs Schneiden und Zusammenfügen ist:

Delphi-Quellcode:

function RunCaptured(const _exeName, _cmdLine: string): String;
var
  TmpName: string;
  TmpSec: TSecurityAttributes;
  Tmp: Windows.THandle;
  Start: TStartupInfo;
  ProcInfo: TProcessInformation;
  Res: TStringList;
  Return: Cardinal;
begin
  try
    TmpName := 'Test.tmp';
    FillChar(TmpSec, SizeOf(TmpSec), #0);
    TmpSec.nLength := SizeOf(TmpSec);
    TmpSec.bInheritHandle := True;

    Tmp := Windows.CreateFile(PChar(TmpName),
           Generic_Write, File_Share_Write,
           @TmpSec, Create_Always, File_Attribute_Normal, 0);

    try
      FillChar(Start, SizeOf(Start), #0);
      Start.cb := SizeOf(Start);
      Start.hStdOutput := Tmp;
      Start.dwFlags := StartF_UseStdHandles or StartF_UseShowWindow;
      Start.wShowWindow := SW_Hide;

      if CreateProcess(nil, PChar(_exeName + ' ' + _cmdLine), nil, nil, True,0, nil, nil, Start, procInfo) then
      begin
        SetPriorityClass(ProcInfo.hProcess, Idle_Priority_Class);
        WaitForSingleObject(ProcInfo.hProcess, Infinite);
        GetExitCodeProcess(ProcInfo.hProcess, Return);
        CloseHandle(ProcInfo.hThread);
        CloseHandle(ProcInfo.hProcess);
        Windows.CloseHandle(Tmp);
        Res := TStringList.Create;
        try
          Res.LoadFromFile(TmpName);
          Result := Res.Text;
        finally
          Res.Free;
        end;

        Windows.DeleteFile(PChar(TmpName));
      end
        else
      begin
        Application.MessageBox(PChar(SysErrorMessage(GetLastError())),
          'RunCaptured Error', MB_OK);
        //result := 'Fehler: '+PChar(SysErrorMessage(GetLastError()))
      end;

    except
      Windows.CloseHandle(tmp);
      Windows.DeleteFile(PChar(tmpName));
      raise;
    end;
  finally {} end;
end;


//Video Info auslesen:
s := RunCaptured([pfad ffprobe.exe], ' -select_streams v -show_streams [pfad video]');

//i-frames finden:
s := RunCaptured([pfad ffprobe.exe], ' -show_frames -select_streams v [pfad video]');

//Schnitt mit ffmpeg:
RunCaptured([pfad ffmpeg.exe], ' -i '+[pfad video]+' -ss [Schnitt Anfang] -t [Schnitt Ende] -acodec copy -vcodec copy [Speicherort output]');
//Schnitt Anfang und Ende: String (Zeit in Sekunden), z.B. '128.240' für 128 Sekunden, 240 Millisekunden

//Schnitt mit mp4box
Shellexecute(0,nil,PChar([pfad mp4box.exe]),PChar('[pfad video] -splitx [Schnitt Anfang]:[Schnitt Ende] -out [Speicherort output]'),nil,SW_hide);

//zusammenfügen ffmpeg:
Shellexecute(0,nil,PChar([pfad ffmpeg.exe]),PChar(' -f concat -i [C:\text.txt] -codec copy [Speicherort output]'),nil,SW_hide);
//Aufbau der temporären Datei text.txt:
//file C:\xy1.mp4
//file C:\xy2.mp4
//file C:\xy3.mp4

//zusammenfügen mp4box:
procedure TForm1.Button2Click(Sender: TObject); //Speicherorte der Teildateien in Listbox2
var
i,lc: Integer;
aufruf, outpath, mp4boxpath: String;
begin
mp4boxpath := ExtractFilePath(ParamStr(0))+'mp4box.exe';
   If FileExists(mp4boxpath) then begin
   outpath := 'C:\~temp\';
   ForceDirectories(outpath);
   lc := Listbox2.Items.Count;
      If lc > 1 then begin
         aufruf := 'mp4box';
         for i := 0 to Listbox2.Items.Count-1 do begin
         aufruf := aufruf+' -cat '+Listbox2.Items[i];
         end;
         aufruf := aufruf+' -out '+outpath;
         RunCaptured(mp4boxpath, aufruf);
      end else begin
      ShowMessage('Choose at least two mp4-files!');
      end;
   end else begin
   ShowMessage('mp4box not found!');
   end;
end;
Ist aber auch alles ganz gut dokumentiert auf den Seiten von ffmpeg und mp4box


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz