AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte mp4 Cut and Merge
Thema durchsuchen
Ansicht
Themen-Optionen

mp4 Cut and Merge

Ein Thema von nezumi7 · begonnen am 15. Mär 2015 · letzter Beitrag vom 21. Mär 2015
Antwort Antwort
nezumi7
Registriert seit: 11. Apr 2011
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.....

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).
Miniaturansicht angehängter Grafiken
screenshot.jpg  
Angehängte Dateien
Dateityp: 7z nmc.7z (211,2 KB, 69x aufgerufen)

Geändert von nezumi7 (17. Mär 2015 um 06:05 Uhr)
 
hathor
 
#2
  Alt 15. Mär 2015, 17:19
Wenn's funktionieren würde...

Warum erscheint bei jedem Fehler ein Fenster?
Das nervt total!
Miniaturansicht angehängter Grafiken
mp4cutter_fehler.jpg  
  Mit Zitat antworten Zitat
nezumi7
 
#3
  Alt 15. Mär 2015, 17:53
hmmm, komisch. Den Fehler hatte ich noch nie.

Ist das Video eine mp4 Datei?
  Mit Zitat antworten Zitat
hathor
 
#4
  Alt 15. Mär 2015, 18:07
MediaInfo:
Miniaturansicht angehängter Grafiken
mp4cutter_mediainfo.jpg  
  Mit Zitat antworten Zitat
nezumi7
 
#5
  Alt 15. Mär 2015, 18:19
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?
  Mit Zitat antworten Zitat
hathor
 
#6
  Alt 15. Mär 2015, 19:38
Dir:
Miniaturansicht angehängter Grafiken
mp4cutter_dir.jpg  
  Mit Zitat antworten Zitat
nezumi7
 
#7
  Alt 17. Mär 2015, 05:57
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?
  Mit Zitat antworten Zitat
hathor
 
#8
  Alt 17. Mär 2015, 06:54
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.
Miniaturansicht angehängter Grafiken
lav-decoder.jpg  

Geändert von hathor (17. Mär 2015 um 07:59 Uhr)
  Mit Zitat antworten Zitat
hathor
 
#9
  Alt 19. Mär 2015, 22:14
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
  Mit Zitat antworten Zitat
nezumi7
 
#10
  Alt 21. Mär 2015, 08:00
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:20 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