ImageCaptureCore, Canon und ein dicker Hals

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • ImageCaptureCore, Canon und ein dicker Hals

    Ich hab' gerade die Faxen dicke. Ich versuche, mit Kameras per Picture Transfer Protocol zu kommunizieren. Dazu verwende ImageCaptureCore's

    - requestSendPTPCommand: ... (ICCameraDevice)

    Das ist meines Wissens seit 10.6 der empfohlene Weg. Mit einer Nikon (D70) funktioniert das wunderbar.

    Das Problem: Mit einer Canon (450D oder 20D) geht nichts. Jeder Aufruf bekommt den ImageCaptureCore-Fehler -9936 zurück ("The operation couldn’t be completed."). Selbst bei elementaren Befehlen, die jedes PTP-Gerät unterstützen muss (z.B. GetDeviceInfo).

    Der Fehler tritt auch bei Apples Sample PTPPassThrough auf - er wird nur nicht standardmäßig ausgegeben.

    Mit einer eigenen PTP-Implementation geht alles einwandfrei. Ich würde allerdings ungerne PTP vollständig selbst implementieren, wenn es auch über ein eingebautes Framework geht.

    Alle Kamerahersteller haben Fehler und eigene Erweiterungen in ihren PTP-Implementationen, aber an dieser elementaren Stelle kann man davon ausgehen, dass die Kameras sich PTP-konform verhalten.

    Und da sind sie, meine drei Fragen:

    - Kann es wirklich sein, dass Apple eine API rausbringt, die an so elementarer Stelle nicht funktioniert?

    - Hat jemand Erfahrungen mit PTP über ImageCaptureCore? Kennt jemand einen Workaround? (außer Canons SDK, das ist off limits).

    - Hat jemand eine Nikon- oder Canon-DSLR und Lust, das PTPPassThrough-Sample durchlaufen zu lassen? (in Controller.m in Zeile 269 "[self log:[error description]];" einfügen, bauen und starten, Kamera anschließen, auf "Start Browsing" und dann z.B. auf "Get Storage IDs" klicken). Wenn das Problem reproduzierbar ist, liegt's nicht an meinem Setup und kann getrost an bugreport.apple.com.

    Ich hoffe nicht, dass man demnächst immer mehrere Systemversionen abwarten muss, bis ein Framework halbwegs brauchbar ist...
    Multigrad - 360°-Produktfotografie für den Mac
  • Canon...

    Ich hab nur mal das SDK unter Windows benutzt. Ging eigentlich ganz gut. Nur....Man muss einen Windows-Event-Loop starten, damit der die Callbacks auch tatsächlich macht. Steht nirgends in der Doku. Der macht auch (unter Windows) unsichtbare Fenster auf etc. Von daher bin ich prinzipiell etwas skeptisch, was die Code-Qualität von Canon angeht.
    Aber ansich ist das SDK ganz nett..gibs das inzwischen offiziell für den Mac? Damit kann man immerhin noch ganz andere lustige Dinge machen, als nur Bilder übertragen. Ich glaub ich hatte damals HDR Bilder aufgenommen oder so..

    Leider kann ich Dir aber sonst nicht helfen. Hab nichtmal eine Canon, die war damals von Arbeit...
    C++
  • @zerm: Keine Ahnung, ob es das SDK mittlerweile für den Mac gibt - so wie es aussieht wollen soll man sich erst unter eigenartigen Bedingungen anmelden, bevor man sehen kann, was es eigentlich gibt. Ach nö. Zumal das Fernsteuer- und Tethered Capture-Zeugs auch per PTP laufen sollte. So ziemlich alles von Blendensteuerung bis LiveView-Bild. Aber dieses Mal scheint Canon nicht Schuld zu sein, wie gesagt, bei PTP von Hand reagiert die Kamera (für Canon-Verhältnisse) standardkonform und ordentlich.

    @Markus:

    Danke, wäre echt nett.
    Multigrad - 360°-Produktfotografie für den Mac
  • Quellcode

    1. Looking for a PTP camera...
    2. Found a PTP camera 'Canon EOS 400D DIGITAL'.
    3. Opening a session on 'Canon EOS 400D DIGITAL'...
    4. Session opened on 'Canon EOS 400D DIGITAL'.
    5. PTP camera 'Canon EOS 400D DIGITAL' is ready.
    6. Sending PTP request:
    7. PTPOperationRequest <0x1002139c0>:
    8. operationCode : 0x1004
    9. transactionID : 0x00000000
    10. numberOfParameters : 0
    11. Completed request:
    12. PTPOperationRequest <0x1002139c0>:
    13. operationCode : 0x1004
    14. transactionID : 0x00000000
    15. numberOfParameters : 0
    Alles anzeigen


    Es gibt noch eine Exeption

    Quellcode

    1. PTPPassThrough[38590:a0f] *** -[NSBigMutableString replaceCharactersInRange:withString:]: nil argument


    Bist Du Dir sicher mit Zeile 269?

    Quellcode

    1. if ( ptpRequest )
    2. {
    3. [self log:@"\nCompleted request:"];
    4. [self log:[ptpRequest description]];
    5. [self log:[error description]];
    6. }
    Xcode 4 sucks – „,Multiple exclamation marks‘, he went on, shaking his head, are a sure sign of a diseased mind.‘“ (Terry Pratchett 1992: Eric)

    "Wir ordnen und befehlen hiermit allen Ernstes, dass die Advocati wollene schwarze Mäntel, welche bis unter das Knie gehen, unserer Verordnung gemäß zu tragen haben, damit man die Spitzbuben schon von weitem erkennt." (Friedrich Wilhelm I., Soldatenkönig)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von mika ()

  • mattik schrieb:

    @zerm: Keine Ahnung, ob es das SDK mittlerweile für den Mac gibt - so wie es aussieht wollen soll man sich erst unter eigenartigen Bedingungen anmelden, bevor man sehen kann, was es eigentlich gibt. Ach nö. Zumal das Fernsteuer- und Tethered Capture-Zeugs auch per PTP laufen sollte. So ziemlich alles von Blendensteuerung bis LiveView-Bild. Aber dieses Mal scheint Canon nicht Schuld zu sein, wie gesagt, bei PTP von Hand reagiert die Kamera (für Canon-Verhältnisse) standardkonform und ordentlich.

    Ja, ich hatte mich damals angemeldet. Hatte aber problemlos geklappt. Hab grad in die 2.4 geschaut, da ist immer noch keine Lib für Mac dabei. Nur in den Headern steht immernoch #ifdef __MACOS__ etc.
    Aber gut, wenn das alles über dies PTP geht, werde ich mir für das nächste mal merken, sollte ich jemals nocheinmal eine Kamera selber ansteuern müssen.
    Achso, was ich noch gesehen habe, ist dass im SDK noch Code drin ist, um RAWs zu verarbeiten. Aber das ist ja auch im MacOS schon dabei, wenn ich mich recht erinner....
    C++
  • @mika: Danke schonmal. Genau das Ergebnis bekomme ich auch, wenn die Zeile 269 nicht eingefügt ist. In der Methode kommt das Kommando von der Kamera zurück - und zwar immer, ob der Befehl geklappt hat oder nicht. Wenn alles glatt läuft, müsste error nil sein. Ist er bei mir aber nicht. Apple gibt im Beispielcode den Fehler nicht aus, deshalb sieht das so richtig aus (abgesehen davon, dass bei keinem der Knöpfe irgendwas Sinnvolles passiert). Kurz: Ja, die Stelle soll so sein. Kannst Du die Zeile da nochmal reinklopfen und nochmal durchlaufen lassen? Danke!

    @zerm: Eigentlich ist PTP grandios, damit geht das alles. Mit ImageCaptureCore ist das Auslösen von Fotos auch ohne eigenes PTP schon dabei, ich brauch's eigentlich nur für die Steuerung der Kameraparameter (in meinem Fall hauptsächlich Blende, Belichtungszeit, Weißabgleich, Empfindlichkeit und Fokus, geht aber noch vieles mehr). Die RAWs kann OSX per ImageIO schon von Haus aus. Wie gesagt: Eigentlich. Mittlerweile habe ich notgedrungen auf mein eigenes PTP-Layer gewechselt. Damit geht das alles soweit, abgesehen davon, dass sich Canon mal wieder nicht an den Standard hält. Mit Nikon: Alles perfekt.
    Multigrad - 360°-Produktfotografie für den Mac
  • Ich habe die Zeile jetzt mal abgesichert:

    Quellcode

    1. if(error)
    2. [self log:[error description]];



    Dann bekomme ich folgende Ausgabe (alle Knöppe gedrückt)

    Quellcode

    1. Looking for a PTP camera...
    2. Found a PTP camera 'Canon EOS 400D DIGITAL'.
    3. Opening a session on 'Canon EOS 400D DIGITAL'...
    4. Session opened on 'Canon EOS 400D DIGITAL'.
    5. PTP camera 'Canon EOS 400D DIGITAL' is ready.
    6. Sending PTP request:
    7. PTPOperationRequest <0x103107750>:
    8. operationCode : 0x1004
    9. transactionID : 0x00000000
    10. numberOfParameters : 0
    11. Completed request:
    12. PTPOperationRequest <0x103107750>:
    13. operationCode : 0x1004
    14. transactionID : 0x00000000
    15. numberOfParameters : 0
    16. Received data:
    17. inData [8 bytes]:
    18. 0: 01000000 01000100 ........
    19. Received response:
    20. PTPOperationResponse <0x10310c9d0>:
    21. responseCode : 0x2001
    22. transactionID : 0x0000000b
    23. numberOfParameters : 0
    24. _storageID: 65537
    25. Sending PTP request:
    26. PTPOperationRequest <0x102f354d0>:
    27. operationCode : 0x1006
    28. transactionID : 0x00000000
    29. numberOfParameters : 3
    30. parameters : 0x00010001
    31. parameters : 0x00000000
    32. parameters : 0x00000000
    33. Completed request:
    34. PTPOperationRequest <0x102f354d0>:
    35. operationCode : 0x1006
    36. transactionID : 0x00000000
    37. numberOfParameters : 3
    38. parameters : 0x00010001
    39. parameters : 0x00000000
    40. parameters : 0x00000000
    41. Received response:
    42. PTPOperationResponse <0x104605aa0>:
    43. responseCode : 0x2001
    44. transactionID : 0x0000000c
    45. numberOfParameters : 1
    46. parameters : 0x00000007
    47. _numObjects: 7
    48. Sending PTP request:
    49. PTPOperationRequest <0x104605860>:
    50. operationCode : 0x1007
    51. transactionID : 0x00000000
    52. numberOfParameters : 3
    53. parameters : 0x00010001
    54. parameters : 0x00000000
    55. parameters : 0x00000000
    56. Completed request:
    57. PTPOperationRequest <0x104605860>:
    58. operationCode : 0x1007
    59. transactionID : 0x00000000
    60. numberOfParameters : 3
    61. parameters : 0x00010001
    62. parameters : 0x00000000
    63. parameters : 0x00000000
    64. Received data:
    65. inData [32 bytes]:
    66. 0: 07000000 00000430 00009031 E17D9031 .......0...1.}.1
    67. 10: F17D9031 017E9031 117E9031 217E9031 .}.1.~.1.~.1!~.1
    68. Received response:
    69. PTPOperationResponse <0x10022ef50>:
    70. responseCode : 0x2001
    71. transactionID : 0x0000000d
    72. numberOfParameters : 0
    73. _numObjects: 7
    74. object 0: 0x30040000
    75. object 1: 0x31900000
    76. object 2: 0x31907DE1
    77. object 3: 0x31907DF1
    78. object 4: 0x31907E01
    79. object 5: 0x31907E11
    80. object 6: 0x31907E21
    Alles anzeigen
    Xcode 4 sucks – „,Multiple exclamation marks‘, he went on, shaking his head, are a sure sign of a diseased mind.‘“ (Terry Pratchett 1992: Eric)

    "Wir ordnen und befehlen hiermit allen Ernstes, dass die Advocati wollene schwarze Mäntel, welche bis unter das Knie gehen, unserer Verordnung gemäß zu tragen haben, damit man die Spitzbuben schon von weitem erkennt." (Friedrich Wilhelm I., Soldatenkönig)
  • Whoa - bei Dir gehts. Ist ja eigenartig, hier mit ner 450D kommen da Fehler am laufenden Band. Dann muss ich mir wohl mal einen Sack verschiedener EOSe organisieren... Danke Dir vielmals.

    Ach ja: Eine Nachricht an nil zu schicken ist zwar nicht falsch, aber natürlich ist Deine Zeile sauberer.
    Multigrad - 360°-Produktfotografie für den Mac
  • mattik schrieb:

    Eine Nachricht an nil zu schicken ist zwar nicht falsch, aber natürlich ist Deine Zeile sauberer.


    Richtig, aber in diesem Fall wird dann an Log nil geschickt und Log versucht dann nil in einen String einzufügen -> Exception.
    Xcode 4 sucks – „,Multiple exclamation marks‘, he went on, shaking his head, are a sure sign of a diseased mind.‘“ (Terry Pratchett 1992: Eric)

    "Wir ordnen und befehlen hiermit allen Ernstes, dass die Advocati wollene schwarze Mäntel, welche bis unter das Knie gehen, unserer Verordnung gemäß zu tragen haben, damit man die Spitzbuben schon von weitem erkennt." (Friedrich Wilhelm I., Soldatenkönig)
  • mattik schrieb:

    NSLog([nil description]) gibt zwar eine Compilerwarnung, aber keine Exception. Gibt einfach nichts aus. Ist das bei Dir anders?

    Es geht nicht um NSLog sondern um die Methode log, die fügt den String in einen TextView ein.
    Xcode 4 sucks – „,Multiple exclamation marks‘, he went on, shaking his head, are a sure sign of a diseased mind.‘“ (Terry Pratchett 1992: Eric)

    "Wir ordnen und befehlen hiermit allen Ernstes, dass die Advocati wollene schwarze Mäntel, welche bis unter das Knie gehen, unserer Verordnung gemäß zu tragen haben, damit man die Spitzbuben schon von weitem erkennt." (Friedrich Wilhelm I., Soldatenkönig)
  • Hi Mattik,

    bin leider erst jetzt dazu gekommen:

    Quellcode

    1. Looking for a PTP camera...
    2. Found a PTP camera 'Canon EOS 350D DIGITAL'.
    3. Opening a session on 'Canon EOS 350D DIGITAL'...
    4. Session opened on 'Canon EOS 350D DIGITAL'.
    5. PTP camera 'Canon EOS 350D DIGITAL' is ready.
    6. Sending PTP request:
    7. PTPOperationRequest <0x103602d60>:
    8. operationCode : 0x1004
    9. transactionID : 0x00000000
    10. numberOfParameters : 0
    11. Completed request:
    12. PTPOperationRequest <0x103602d60>:
    13. operationCode : 0x1004
    14. transactionID : 0x00000000
    15. numberOfParameters : 0
    16. Received data:
    17. inData [8 bytes]:
    18. 0: 01000000 01000000 ........
    19. Received response:
    20. PTPOperationResponse <0x100148f50>:
    21. responseCode : 0x2001
    22. transactionID : 0x00000203
    23. numberOfParameters : 0
    24. _storageID: 1
    25. Sending PTP request:
    26. PTPOperationRequest <0x10014c8b0>:
    27. operationCode : 0x1006
    28. transactionID : 0x00000000
    29. numberOfParameters : 3
    30. parameters : 0x00000001
    31. parameters : 0x00000000
    32. parameters : 0x00000000
    33. Completed request:
    34. PTPOperationRequest <0x10014c8b0>:
    35. operationCode : 0x1006
    36. transactionID : 0x00000000
    37. numberOfParameters : 3
    38. parameters : 0x00000001
    39. parameters : 0x00000000
    40. parameters : 0x00000000
    41. Received response:
    42. PTPOperationResponse <0x1036c4b20>:
    43. responseCode : 0x2001
    44. transactionID : 0x00000213
    45. numberOfParameters : 1
    46. parameters : 0x0000023D
    47. _numObjects: 573
    48. Sending PTP request:
    49. PTPOperationRequest <0x100152460>:
    50. operationCode : 0x1007
    51. transactionID : 0x00000000
    52. numberOfParameters : 3
    53. parameters : 0x00000001
    54. parameters : 0x00000000
    55. parameters : 0x00000000
    56. Completed request:
    57. PTPOperationRequest <0x100152460>:
    58. operationCode : 0x1007
    59. transactionID : 0x00000000
    60. numberOfParameters : 3
    61. parameters : 0x00000001
    62. parameters : 0x00000000
    63. parameters : 0x00000000
    64. Received data:
    65. inData [2296 bytes]:
    66. 0: 3D020000 00000030 00002432 00002832 =......0..$2..(2
    67. 10: 00002C32 00003032 00003432 00003832 ..,2..02..42..82
    68. ...
    69. 8F0: A2468135 B2468135 .F.5.F.5
    70. Received response:
    71. PTPOperationResponse <0x1036facb0>:
    72. responseCode : 0x2001
    73. transactionID : 0x0000021e
    74. numberOfParameters : 0
    75. _numObjects: 573
    76. object 0: 0x30000000
    77. object 1: 0x32240000
    78. object 2: 0x32280000
    79. object 3: 0x322C0000
    80. ...
    Alles anzeigen

    Scheint zu klappen...
  • Danke! Das ist absolut schräg. Ich habe am Wochenende mit verschiedensten Canons herumprobiert (450D, 50D, 1D Mark III usw.) - mit sehr unterschiedlichen Ergebnissen. Bei einigen klappt es, bei einigen nicht. Das Absurde ist, dass mit anderen PTP-Implementation auf Transportebene alles funktioniert.

    Die höheren Funktionen sind sowohl bei Canon als auch bei Nikon eh nur noch an das Protokoll angelehnt, sodass da ohnehin jede Menge Handarbeit rein muss. Und da die Apple-Implementation einige Beschränkungen hat (u.a. ist während einer Bildübertragung kein Auslösen neuer Bilder möglich), sodass ich jetzt eh auf meine eigene Implementation umgestiegen bin. Klappt mittlerweile mit allen getesteten Kameras ganz gut.

    Kurz: Ich weiß zwar immer noch nicht, was da genau schief geht, aber immerhin weiß ich jetzt , dass es wohl sehr spezifisch auf bestimmte Kamera- und ImageCaptureCore-Kombinationen beschränkt ist. Vielen Dank!
    Multigrad - 360°-Produktfotografie für den Mac