![]() |
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). |
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! |
AW: mp4 Cut and Merge
hmmm, komisch. Den Fehler hatte ich noch nie.
Ist das Video eine mp4 Datei? |
AW: mp4 Cut and Merge
Liste der Anhänge anzeigen (Anzahl: 1)
MediaInfo:
|
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? |
AW: mp4 Cut and Merge
Liste der Anhänge anzeigen (Anzahl: 1)
Dir:
|
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? |
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: ![]() Jetzt sieht man das Video. Die LAV-Decoder werden geladen. |
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 |
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:
Ist aber auch alles ganz gut dokumentiert auf den Seiten von ffmpeg und mp4boxfunction 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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz