WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Computer Vision System Toolbox - vision.VideoFileWriter

 

Brate
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 17.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.12.2016, 01:21     Titel: Computer Vision System Toolbox - vision.VideoFileWriter
  Antworten mit Zitat      
Hi,

ich habe versucht eine .avi-Datei mit Ton/Audio in ein .mp4-Datei umzuwandeln. Dazu habe ich folgenden Code unter Verwendung der Computer Vision System Toolbox geschrieben:

Code:

%% Video File Reader Objekt erstellen
vfr = vision.VideoFileReader('Cris Drift vs Patrick.avi', 'AudioOutputPort',true);
%% Video File Writer Objekt erstellen
vfw = vision.VideoFileWriter('Cris Drift vs Patrick.mp4', 'FileFormat','MPEG4', 'AudioInputPort',true, 'FrameRate',vfr.info.VideoFrameRate, 'Quality',90);

%% Video und Audio Frame aus .avi-Objekt holen und in .mp4-Objekt schreiben
while ~isDone(vfr)
  [frame, audio] = step(vfr); % [frame, audio] = vfr();
  step(vfw, frame, audio); % vfw(frame, audio);
end
release(vfr);
release(vfw);
 


Leider bekomme ich die Fehlermeldung:


    Error using vision.VideoFileWriter/parenReference
    Too many input arguments; expected 1 (in addition to the object handle), got 2.

    Error in avi2mp4 (line 16)
    vfw(frame, audio);



Ich hab keine Ahnung wieso!?
Ich muss die Audio-Daten als Funktionsparameter übergeben. So ist es auch in der MATLAB Dokumentation beschrieben:

- Dokumentation für das Video File Writer Objekt
- Dokumentation für das Video File Reader Objekt


Ich hoffe ihr könnt helfen.
Vielen Danke schon mal im Voraus.

Beste Grüße
Brate
Private Nachricht senden Benutzer-Profile anzeigen


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 22.12.2016, 11:52     Titel:
  Antworten mit Zitat      
Ein paar Rückfrage:

1. Der Fehler passiert in Zeile 16 - es sind aber keine 16 Zeilen Beispielcode. Bitte den vollständigen Code posten.

2. Welches Release und Betriebssystem?

3. Gehen generelle Beispiele aus der Doku?

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Brate
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 17.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.12.2016, 13:19     Titel:
  Antworten mit Zitat      
Hi Andreas,

das ist der komplette Code ich habe nur ein paar Kommentare entfernt, die bei der Erzeugung der Fehlermeldung noch drin waren.

Ich verwende die Computer Vision Toolbox 7.2 (R2016b) und Windows 7 (jeweils die 64-Bit Version)

Der Code funktioniert, wenn ich nur Frames schreibe ohne Audio. Wenn ich also nur die Variable frames an die Funktion übergebe.
Allerdings widerspricht die Fehlermeldung der Beschreibung in der Dokumentation, was mich aber doch ein bisschen wundert.

Beste Grüße
Brate
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 22.12.2016, 13:53     Titel:
  Antworten mit Zitat      
Die Helfer hier sind Freiwillige, d.h. es ist üblich den vollen Code in einer Weise zu posten, dass es auch direkt ausführbar ist. Ich habe jetzt mal angepasst und ein AVI File genommen, dass in der Installation der Toolbox dabei ist:

Code:

vfr = vision.VideoFileReader('vipfly.avi', 'AudioOutputPort',true);

vfw = vision.VideoFileWriter('Cris Drift vs Patrick.mp4', 'FileFormat','MPEG4', 'AudioInputPort',true, 'FrameRate',vfr.info.VideoFrameRate, 'Quality',90);

%% Video und Audio Frame aus .avi-Objekt holen und in .mp4-Objekt schreiben
while ~isDone(vfr)
  [frame, audio] = step(vfr); % [frame, audio] = vfr();
  step(vfw, frame, audio); % vfw(frame, audio);
end
release(vfr);
release(vfw);
 



Ich bekomme eine Warnung und eine leicht andere Fehlermeldung, das sind wichtige Informationen:

Code:

Warning: The AudioInputPort property is not relevant in this configuration of the System
object.
> In matlab.system.SystemProp/parseInputs
  In matlab.system.SystemProp/setProperties
  In vision.VideoFileWriter
  In test_forum_vip (line 7)
Error using vision.VideoFileWriter/step
Too many input arguments; expected 1 (in addition to the object handle), got 2.

Error in test_forum_vip (line 12)
  step(vfw, frame, audio); % vfw(frame, audio);
 


Ich guck jetzt mal rein.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 22.12.2016, 14:00     Titel:
  Antworten mit Zitat      
Die Warnungen sind zwar eindeutig - einfach 'AudioOutputPort',true weglasssen, aber haben mit der Fehlermeldung zu tun.

Die Fehlermeldung die ich gepostet habe verweist auf den STEP Befehl. Die STEP Function aus der Control System Toolbox hat bei mir eine höhere Priorität:

Code:


Also gucke ich in die Doku und siehe da:
Code:


web(fullfile(docroot, 'vision/ref/vision.videoplayer.step.html'))
 


Note: Starting in R2016b, instead of using the step method to perform the operation defined by the System object™, you can call the object with arguments, as if it were a function. For example, y = step(obj,x) and y = obj(x) perform equivalent operations.

Problem gelöst (oder zumindest erklärt Very Happy )

Andreas

Zuletzt bearbeitet von Andreas Goser am 22.12.2016, 15:32, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Brate
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 17.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.12.2016, 15:09     Titel:
  Antworten mit Zitat      
Hi Andreas

Ja da hast du recht. Habe ich nicht daran gedacht. Nächstes Mal poste ich den Code mit Videos aus den MATLAB Examples.

Ich danke dir, dass du dir die Zeit genommen hast dich ein bisschen mit dem Problem auseinanderzusetzen.

Die ausgegebene Warnung macht für mich genau so wenig Sinn, wie die Fehlermeldung. Ich will nicht nur die Bild-Daten sondern auch die Audio-Daten des Videos in die .mp4-Datei schreiben. Die interessante Frage ist, warum die AudioInputPort Property irrelevant ist? Und noch interessanter wäre eine Antwort auf die Frage ^^

Was ich jetzt mit dem Link zur Doku für die step-Funktion des VideoPlayers anfangen soll verstehe ich nicht. VideoFileReader und VideoFileWriter sind die Funktionen die ich brauche und verwende. Dass man die Objekte auch direkt als Funktion ansprechen kann, ist mir klar. Deshalb die Kommentare mit der entsprechenden Syntax.

Das Problem ist, dass ich nicht verstehe, warum keine zwei Argumente akzeptiert werden (was notwendig ist, um auch Audio-Daten im .mp4-Video zu speichern und das möchte ich tun), obwohl es genau so in der Dokumentation beschrieben ist. SIEHE LINKS DIE ICH GEPOSTET HABE.


Kann da jemand helfen?


Viele Grüße
Brate
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 22.12.2016, 15:19     Titel:
  Antworten mit Zitat      
Die Warnungen kommen, weil beim Einlesen (VideoFileReader) braucht es keine Informationen zum Ausgeben (AudioOutputPort) und umgekehrt.

Die Fehlermeldung kommt wahrscheinlich, weil die STEP Funktion aus der Control Systems Toolbox gerufen wird und diese andere Parameter erwartet. Mit dem WHICH Befehl kann man die Theorie prüfen. [EDIT: Stimmt nicht, ich gucke noch mal rein]

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Brate
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 17.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.12.2016, 16:03     Titel:
  Antworten mit Zitat      
Das Video (.avi) enthält aber eine Audiospur. Die kann man natürlich auch hören wenn man sich das Video mit einem beliebigen Media Player ansieht.

Oder wie meintest du das?

Wenn du da was findest zu der Priorität der step Funktion wäre das interessant, da ich gedacht habe es wurde keine Priorität geben und der Zusammenhang zur Toolbox wird über das übergebene Objekt hergestellt.
Wenn ich die Objekte als Funktion verwende, was du auch in deinem Post erwähnt hast, funktioniert das auch nicht. Ich bekomme trotzdem die selbe Fehlermeldung. Kann es dann trotzdem an der Priorität liegen?

Brate
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 22.12.2016, 16:09     Titel:
  Antworten mit Zitat      
Ich bin jetzt ziemlich verwirrt... Was ich gemacht habe: Einen ähnlichen Beispielcode genommen, getestet dass der läuft und Schritt für Schritt an den Code hier angepasst. Nur um festzustellen, dass der Beispielcode nichts sinnvolles macht - nur eben fehlerfrei durchläuft. Rolling Eyes

Ich muss jetzt leider sagen ich habe hier wohl teilweise mehr zur Verwirrung beigetragen, als geholfen. Bitte den MathWorks Support kontaktieren.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Brate
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 17.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.12.2016, 17:27     Titel:
  Antworten mit Zitat      
Danke nochmal und keine Sorge, meine Verwirrung nicht schlimmer als sie vorher schon war Wink

Ich erkläre mein Problem trotzdem nochmal.
Im Voraus: Mir ist bewusst, dass ich für das was ich machen will auch fertige (kostenlose) Programme gibt. Ich wollte nur aus Interesse ein MATLAB-Skript mit Hilfe der Computer Vision System Toolbox 7.2 (R2016b) schreiben.
Das Ziel ist es, eine Videoaufnahme mit Ton, die als .avi-Datei vorliegt, in einer .mp4-Datei zu speichern. Laut MATLAB Doku müsste das mit den Objekten VideoFileReader und VideoFileWriter möglich sein:
1. VideoFileReader-Objekt erstellen (Option: 'AudioOutputPort', true)
2. VideoFileWriter-Objekt erstellen (Option: 'AudioInputPort', true)
3. Frame für Frame aus VideoFileReader-Objekt holen und an VideoFileWriter-Objekt übergeben
4. VideoFileReader-Objekt und VideoFileWriter-Objekt schließen

Der unten aufgeführte Code sollte dies auch ausführen, stattdessen erhalte ich aber die unten aufgeführten Meldungen. Diese ergeben für mich aber keinen Sinn, da gemäß der Beschreibung in der MATLAB Doku die Funktion step() auch die Audio-Daten übergeben werden können bzw. müssen, damit auch der Ton in der zu schreibenden .mp4-Datei gespeichert wird. Dafür muss beim VideoFileReader-Objekt die Option 'AudioOutputPort' auf true gesetzt werden und beim VideoFileWriter-Objekt die Option 'AudioInputPort' ebenfalls auf true.

Folgendes Beispiel aus der MATLAB-Dokumentation zu vision.VideoFileWriter bildet die Grundlage für meinen Code:
Code:

%% Write a Video to an AVI File
%
%%
% Set up the reader and writer objects.
videoFReader = vision.VideoFileReader('viplanedeparture.mp4');
videoFWriter = vision.VideoFileWriter('myFile.avi','FrameRate',...
    videoFReader.info.VideoFrameRate);
%%
% Write the first 50 frames from original file into a newly
% created AVI file.
for i=1:50
    videoFrame = step(videoFReader);
    step(videoFWriter,videoFrame);
end
%% Close the input and output files.
release(videoFReader);
release(videoFWriter);
 


Der Unterschied zu meinem Beispiel liegt darin
1. dass ich eine .avi-Datei in eine .mp4-Datei umwandlen möchte (umgekehrt wie im Beispiel)
2. dass ich auch die Audio-Spur von der .avi-Datei in die .mp4-Datei schreiben möchte

Mein angepasster Code sieht dann so aus:
Code:

%% Video File Reader Objekt erstellen
avi = vision.VideoFileReader('viptrain.avi', 'AudioOutputPort',true);
%% Video File Writer Objekt erstellen
mp4 = vision.VideoFileWriter('MP4video.mp4', 'FileFormat','MPEG4', 'AudioInputPort',true, 'FrameRate',vfr.info.VideoFrameRate, 'Quality',90);

%% Video Frame aus .avi-Objekt holen und in .mp4-Objekt schreiben
while ~isDone(vfr)
  [frame, audio] = step(avi); %[frame, audio] = avi();
  step(mp4, frame, audio); %mp4(frame, audio);
end
release(avi);
release(mp4);
 


Dabei bekomme ich folgende Warn- bzw. Fehlermeldungen:
Code:

Warning: The AudioInputPort property is not relevant in this configuration of the System object.
> In matlab.system.SystemProp/parseInputs
  In matlab.system.SystemProp/setProperties
  In vision.VideoFileWriter
  In avi2mp4 (line 4)
Error using vision.VideoFileWriter/parenReference
Too many input arguments; expected 1 (in addition to the object handle), got 2.

Error in avi2mp4 (line 9)
  step(mp4, frame, audio); %mp4(frame, audio);
 


Wie gesagt: das .avi Video hat eine Audiospur, weshalb für mich das Warning keinen Sinn macht. Und warum die Funktion step nur einen bzw. zwei Argumente erlaubt verstehe ich genauso wenig.


Brate
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.