{"id":24,"date":"2008-06-06T19:40:58","date_gmt":"2008-06-06T18:40:58","guid":{"rendered":"http:\/\/slack.codemaniacs.com\/blog\/?p=24"},"modified":"2023-05-07T06:35:31","modified_gmt":"2023-05-07T05:35:31","slug":"ctypes","status":"publish","type":"post","link":"https:\/\/slack.codemaniacs.com\/blog\/2008\/06\/06\/ctypes\/","title":{"rendered":"ctypes"},"content":{"rendered":"<p>El otro d\u00eda me encontr\u00e9 con un m\u00f3dulo interesante de python que no conoc\u00eda: ctypes. Sirve para comunicarse con librer\u00edas en C: permite cargar librer\u00edas din\u00e1micas y llamar a sus funciones, definir tipos equivalentes a los de C para pasarlos de un lado a otro e incluso especificar funciones python como callbacks de C. Vamos, que se pueden crear <i>bindings<\/i> a librer\u00edas externas escribiendo \u00fanicamente c\u00f3digo python.<\/p>\n<p>Ahi va un ejemplillo tonto usando la libavformat:<\/p>\n<pre>#!\/usr\/bin\/python\nimport sys\nfrom ctypes import *\nimport ctypes.util\n\nav = CDLL(ctypes.util.find_library(\"avformat\"))\nfilename = sys.argv[1]\n# pFormatCtx deberia ser un puntero a AVFormatContext, \n# pero esto es solo un ejemplo simple :)\npFormatCtx = c_void_p() \n\nav.av_register_all()\nav.av_open_input_file(byref(pFormatCtx), filename, None, 0, None)\nav.dump_format(pFormatCtx, 0, filename, 0)\n<\/pre>\n<p>Por supuesto para hacer algo m\u00e1s serio habr\u00eda que declarar en python las estructuras como AVFormatContext que se definen en las cabeceras correspondientes y cosas as\u00ed, pero entonces el programa de ejemplo ser\u00eda demasiado engorroso como para leerlo en un blog ;). El ejemplo muestra una salida como esta:<\/p>\n<pre>$ .\/av.py test.avi \nInput #0, avi, from 'test.avi':\n  Duration: N\/A, bitrate: N\/A\n  Stream #0.0: Video: mpeg4, 512x420,   inf fps(c)\n  Stream #0.1: Audio: vorbis, 22050 Hz, stereo, 24 kb\/s\n<\/pre>\n<p>Referencias:<\/p>\n<ul>\n<li><a href=\"http:\/\/docs.python.org\/lib\/ctypes-ctypes-tutorial.html\">Tutorial de ctypes<\/a><\/li>\n<li><a href=\"http:\/\/www.inb.uni-luebeck.de\/~boehme\/using_libavcodec.html\">Using libavformat and libavcodec<\/a><\/li>\n<li><a href=\"http:\/\/www.inb.uni-luebeck.de\/~boehme\/libavcodec_update.html\">Using libavformat and libavcodec: An Update<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>El otro d\u00eda me encontr\u00e9 con un m\u00f3dulo interesante de python que no conoc\u00eda: ctypes. Sirve para comunicarse con librer\u00edas en C: permite cargar librer\u00edas din\u00e1micas y llamar a sus funciones, definir tipos equivalentes a los de C para pasarlos de un lado a otro e incluso especificar funciones python como callbacks de C. Vamos, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[],"_links":{"self":[{"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/posts\/24"}],"collection":[{"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/comments?post=24"}],"version-history":[{"count":3,"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/posts\/24\/revisions"}],"predecessor-version":[{"id":90,"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/posts\/24\/revisions\/90"}],"wp:attachment":[{"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/media?parent=24"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/categories?post=24"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/tags?post=24"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}