<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>nerdcenter &#187; PHP</title>
	<atom:link href="http://nerdcenter.de/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://nerdcenter.de</link>
	<description>IT-Kniffe eines Webentwicklers.</description>
	<lastBuildDate>Fri, 25 Jun 2010 15:11:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>TYPO3 HTML save cropping</title>
		<link>http://nerdcenter.de/typo3-html-save-crop/</link>
		<comments>http://nerdcenter.de/typo3-html-save-crop/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 16:48:11 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[TYPO3]]></category>

		<guid isPermaLink="false">http://nerdcenter.de/?p=68</guid>
		<description><![CDATA[

Meistens reicht die Methode tslib_cObj::crop vollkommen aus, um Texte &#8211; etwa für eine Listenansicht &#8211; zu kürzen. Wenn jedoch RTE formatierte Texte im Spiel sind und die Formatierung in der gekürzten Version beibehalten werden soll, ist es reine Glückssache, kein invalides (X)HTML durch nicht geschlossene bzw. &#8220;verkrüppelte&#8221; Tags zu generieren. Abhilfe schafft die folgende crop-Methode, [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Meistens reicht die Methode tslib_cObj::crop vollkommen aus, um Texte &#8211; etwa für eine Listenansicht &#8211; zu kürzen. Wenn jedoch RTE formatierte Texte im Spiel sind und die Formatierung in der gekürzten Version beibehalten werden soll, ist es reine Glückssache, kein invalides (X)HTML durch nicht geschlossene bzw. &#8220;verkrüppelte&#8221; Tags zu generieren. Abhilfe schafft die folgende crop-Methode, die eine Portierung der Javascript-Version von <a href="http://blog.stevenlevithan.com/archives/get-html-summary">Steven Levithan</a> darstellt:</p>
<pre>public static function crop($input, $numMaxChars) {
	$output = '';
	$charCount = 0;
	$openTags = array();
	$matches = array();
	$htmlTags = '/\w+|[^\w&lt;]|&lt;(\/)?(\w+)[^&gt;]*(\/)?&gt;|&lt;/';
	$selfClosingHtmlTags = '/^(?:[hb]r|img)$/i';

	preg_match_all($htmlTags, $input, $matches);
	$i = 0;
	$numMatches = count($matches[0]);
	while(($i &lt; $numMatches) &#038;&#038; ($charCount &lt; $numMaxChars)) {
		// are we dealing with an html tag?
		if($matches[2][$i] != '') {
			$output .= $matches[0][$i];
			// if it isn't a self closing tag
			if(preg_match($selfClosingHtmlTags, $matches[2][$i]) == 0) {
				// if its a closing tag...
				if($matches[1][$i] == '/') {
					array_pop($openTags);
				} else {
					$openTags[] = $matches[2][$i];
				}
			}
		} else {
			$charCount += mb_strlen($matches[0][$i], $GLOBALS['TSFE']-&gt;renderCharset);
			if($charCount &lt;= $numMaxChars) {
				$output .= $matches[0][$i];
			}
		}

		$i++;
	}

	// closing open tags
	$i = count($openTags);
	while($i--) {
		$output .= '&lt;/' . $openTags[$i] . '&gt;';
	}

	return $output;
}</pre>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/typo3-html-save-crop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>suPHP und PHP Opcode Caches</title>
		<link>http://nerdcenter.de/suphp-php-opcode-cache/</link>
		<comments>http://nerdcenter.de/suphp-php-opcode-cache/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 11:02:37 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[Linux / Unix]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webserver]]></category>

		<guid isPermaLink="false">http://nerdcenter.de/?p=63</guid>
		<description><![CDATA[

Eigentlich ist suPHP eine nette Sache. Das Apache Modul mod_suphp sorgt in Kombination mit einem SetUID Binary dafür, dass PHP-Skripte mit den Berechtigungen des Benutzers, dem sie gehören, ausgeführt werden. Damit das funktioniert muss man in Binär-Distributionen wie etwa Debian Linux nicht mehr tun, als dass Modul zu installieren, einen Blick auf dessen Konfiguration zu [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Eigentlich ist suPHP eine nette Sache. Das Apache Modul mod_suphp sorgt in Kombination mit einem SetUID Binary dafür, dass PHP-Skripte mit den Berechtigungen des Benutzers, dem sie gehören, ausgeführt werden. Damit das funktioniert muss man in Binär-Distributionen wie etwa Debian Linux nicht mehr tun, als dass Modul zu installieren, einen Blick auf dessen Konfiguration zu werfen und es anschließend zu aktivieren. Vielleicht ist es gerade diese Einfachheit (deren Preis die Starrheit ist), die es so beliebt macht.</p>
<p>Ein großes Problem tut sich aber dann auf, wenn man PHP-Caches wie APC, TurckMM oder eAccelerator verwenden möchte. Denn all diese Caches funktionieren nicht im Zusammenspiel mit suPHP. Zwar lässt sich eine solche Kombination verwenden, doch ist sie leider nutzlos, da nichts gecached wird.</p>
<p>Eine wundervolle Alternative zu der Verwendung von suPHP ist eine Kombination aus Apache, SuExec, FCGID und PHP-CGI. Mit dieser Kombination funktioniert auch das Caching problemlos. Eine Anleitung zum Aufsetzen dieser Kombination findet sich bei <a href="http://wiki.hetzner.de/index.php/Apache_PHP5_fcgi_und_SuExec">Hetzner.de</a>.</p>
<p>Wer seine Websites nicht in dem von der jeweils genutzten Linux Distribution dafür vorgesehenen Verzeichnis ablegt sondern stattdessen beispielsweise in /home/*/public_html/ muss darauf achten, SuExec selbst zu kompilieren oder auf Debian-Systemen die gepatchte Version apache2-suexec-common zu verwenden. Aus Sicherheitsgründen erwartet SuExec bereits bei der Kompilierung den Pfad zum Docroot. Bei der Verwendung von apache2-suexec-common lässt sich das Docroot in der Datei /etc/apache2/suexec/www-data angeben.</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/suphp-php-opcode-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP: Bit Flags</title>
		<link>http://nerdcenter.de/php-bit-flags/</link>
		<comments>http://nerdcenter.de/php-bit-flags/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 16:02:53 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[bit]]></category>
		<category><![CDATA[flags]]></category>

		<guid isPermaLink="false">http://nerdcenter.de/php-bit-flags/</guid>
		<description><![CDATA[

In manchen Fällen können Bit Flags in PHP-Skripten sehr nützlich sein. Etwa wenn es darum geht,
anhand eines &#8220;action&#8221;-Parameters zu entscheiden, welche Objekte instanziiert werden sollen. U.a. auf diese Weise kann
- sonst redundanter &#8211; Code gesparrt werden.
Kennern des binären Zahlensystems sollten also mal einen Blick darauf werfen. Alle anderen sollten dringend zu
diesen Kennern werden &#8211; das [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>In manchen Fällen können Bit Flags in PHP-Skripten sehr nützlich sein. Etwa wenn es darum geht,<br />
anhand eines &#8220;action&#8221;-Parameters zu entscheiden, welche Objekte instanziiert werden sollen. U.a. auf diese Weise kann<br />
- sonst redundanter &#8211; Code gesparrt werden.</p>
<p>Kennern des binären Zahlensystems sollten also mal einen Blick darauf werfen. Alle anderen sollten dringend zu<br />
diesen Kennern werden &#8211; das macht nicht nur das Verständniss des folgenden Codesnippets sondern das ganze (IT-) Leben einfacher <img src='http://nerdcenter.de/wp-includes/images/smilies/icon_wink.gif' alt="Icon Wink in " class='wp-smiley' /> </p>
<p>Das Prinzip ist eigentlich ganz einfach: Es werden einzelne Bits einer Integer Variablen gesetzt. Mit einer<br />
logisch AND Verknüpfung kann dann geprüft werden, ob einzelne Bits gesetzt wurden. Mit AND können Bits gelöscht werden,<br />
mit OR werden sie hinzu addiert. Jedes Bit stellt ein Flag dar. Ist ein Flag gesetzt werden entsprechende Aktionen ausgeführt.</p>
<p>Ein kleines Beispiel zu Bit Flags in PHP5:</p>
<pre>class example_controller {
	/**
	 * Flags set by $this-&gt;setFlags()
	 *
	 * @var int
	 */
	private		$flags			=	0;
	/**
	 * Instantiate the renderer object if this flag is set
	 *
	 * @var int
	 */
	const		FLAG_RENDERER		=	1;
	/**
	 * Do something cool if this flag is set
	 *
	 * @var int
	 */
	const		FLAG_DO_COOL_STUFF	=	2;
	/**
	 * Do even more cool stuff if this flag is set
	 *
	 * @var int
	 */
	const		FLAG_EVEN_MORE_STUFF	=	4;

	/**
	 * Initializes this object
	 *
	 */
	public function init() {
		$this-&gt;setFlags();
		$this-&gt;processFlags();
	}

	/**
	 * Setting the flags according to parameters
	 *
	 */
	private function setFlags() {
		if(!empty($_GET['action'])) {
			switch($_GET['action']) {
				case 'createFoo':
					$this-&gt;flags |= self::FLAG_RENDERER;
					break;
				case 'saveFoo':
					$this-&gt;flags |= self::FLAG_RENDERER;
					$this-&gt;flags |= self::FLAG_DO_COOL_STUFF;
					break;
			}
		}
	}

	/**
	 * Instantiates objects by flags
	 *
	 */
	private function processFlags() {
		// instantiate renderer
		if(($this-&gt;flags &#038; self::FLAG_RENDERER) > 0) {
			require_once(EXTENSION_LIBPATH . 'class.example_renderer.php');
			$this-&gt;renderer = example_renderer::getInstance();
			$this-&gt;renderer-&gt;init();
		}
		// do cool stuff
		if(($this-&gt;flags &#038; self::FLAG_DO_COOL_STUFF) > 0) {
			require_once('./lib/class.cool_stuff_factory.php');
			$myCoolStuff = cool_stuff_factory::makeInstance();
			$myCoolStuff-&gt;save();
		}
		// do even more cool stuff
		if(($this-&gt;flags &#038; self::FLAG_EVEN_MORE_STUFF) > 0) {
			require_once('./lib/class.even_more_stuff.php');
		}
	}
}</pre>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/php-bit-flags/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TYPO3: Frontend Renderer als Singleton</title>
		<link>http://nerdcenter.de/typo3-frontend-renderer-als-singleton/</link>
		<comments>http://nerdcenter.de/typo3-frontend-renderer-als-singleton/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 22:18:13 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[TYPO3]]></category>
		<category><![CDATA[Frontend]]></category>
		<category><![CDATA[Pattern]]></category>
		<category><![CDATA[PHP5]]></category>
		<category><![CDATA[Renderer]]></category>
		<category><![CDATA[Singleton]]></category>

		<guid isPermaLink="false">http://nerdcenter.de/typo3-frontend-renderer-als-singleton/</guid>
		<description><![CDATA[

Renderer sind stets einmalig. Das Singleton Design Pattern bilded genau dies ab: Es wird lediglich eine einzige Instanz der Klasse erzeugt und zurückgegeben. Die folgende Klasse kann als Basis für die View-Schicht der eigenen TYPO3 Extension verwendet werden. Sie ist von pi_base abgeleitet und bietet so den gewohnten Funktionsumfang. Der Codeschnipsel stammt aus einer mini [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Renderer sind stets einmalig. Das Singleton Design Pattern bilded genau dies ab: Es wird lediglich eine einzige Instanz der Klasse erzeugt und zurückgegeben. Die folgende Klasse kann als Basis für die View-Schicht der eigenen TYPO3 Extension verwendet werden. Sie ist von pi_base abgeleitet und bietet so den gewohnten Funktionsumfang. Der Codeschnipsel stammt aus einer mini TYPO3 Extension, an der ich gerade privat bastel.</p>
<pre>&lt;?php
/***************************************************************
*  Copyright notice
*
*  (c) 2009 Thorsten Boock &lt;thorsten (at) nerdcenter.de&gt;
*  All rights reserved
*
*  This script is part of the TYPO3 project. The TYPO3 project is
*  free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 2 of the License, or
*  (at your option) any later version.
*
*  The GNU General Public License can be found at
*  http://www.gnu.org/copyleft/gpl.html.
*
*  This script is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/

require_once(PATH_tslib . 'class.tslib_pibase.php');

/**
 * Frontend Renderer
 * Till PHP 5.3 this class has to be declared as final because
 * we don't know the names of the classes extending this one.
 *
 * @author Thorsten Boock &lt;thorsten (at) nerdcenter.de&gt;
 */
final class tx_tbwhoisonline_renderer_fe extends tslib_pibase {
	/**
	 * Instance of this class (Singleton Design Pattern)
	 *
	 * @var tx_whoisonline_renderer_fe
	 */
	private static		$instance					=	null;
	/**
	 * Path to the template file used for rendering
	 *
	 * @var string
	 */
	private				$templateFile				=	'';
	/**
	 * The contents of the file $this-&gt;templateFile
	 *
	 * @var string
	 */
	private				$templateHTML				=	'';

	/**
	 * Empty constructor (Singleton Design Pattern)
	 *
	 */
	private function __construct() {

	}

	/**
	 * Empty clone function (Singleton Design Pattern)
	 *
	 */
	private function __clone() {

	}

	/**
	 * Instantiating this object (Singleton Design Pattern)
	 *
	 * @return tx_tbwhoisonline_renderer_fe
	 */
	public static function getInstance() {
		if(self::$instance == null) {
			self::$instance = new tx_tbwhoisonline_renderer_fe();
		}
		return self::$instance;
	}

	/**
	 * Initializing this object
	 *
	 * @param array $conf
	 */
	public function init($conf) {
		// init tslib_pibase
		$this-&gt;conf = $conf;
		$this-&gt;pi_setPiVarDefaults();
		$this-&gt;pi_loadLL();
		// get cObj instance and load template
 		$this-&gt;cObj = t3lib_div::makeInstance('tslib_cObj');
 		$this-&gt;templateHTML = $this-&gt;cObj-&gt;fileResource($this-&gt;templateFile);
		// override defaults with typoscript configuration
		foreach($this-&gt;conf as $key =&gt; $value) {
			$key = str_replace('.', '', $key);
			if(isset($this-&gt;$key)) {
				$this-&gt;$key = $value;
			}
		}
	}
}
?&gt;</pre>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/typo3-frontend-renderer-als-singleton/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Module &#8216;json&#8217; already loaded in Unknown on line 0</title>
		<link>http://nerdcenter.de/module-json-already-loaded-in-unknown-on-line-0/</link>
		<comments>http://nerdcenter.de/module-json-already-loaded-in-unknown-on-line-0/#comments</comments>
		<pubDate>Sun, 08 Feb 2009 22:35:32 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[Linux / Unix]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.nerdcenter.de/module-json-already-loaded-in-unknown-on-line-0/</guid>
		<description><![CDATA[

Mir sind gerade fast die Augen rausgefallen als ich bei einem Blick ins Error-Log des Apache Webservers unter Debian Etch abertausende Zeilen mit der Fehlermeldung &#34;PHP Warning: Module &#8216;json&#8217; already loaded in Unknown on line 0&#34; sah. Jeder Seitenaufruf erzeugte diesen Fehler. Die installierten Pakete (php5-cgi + Module sowie apache2 + Module) entstammen dem offiziellen [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Mir sind gerade fast die Augen rausgefallen als ich bei einem Blick ins Error-Log des Apache Webservers unter Debian Etch abertausende Zeilen mit der Fehlermeldung <strong>&quot;PHP Warning: Module &#8216;json&#8217; already loaded in Unknown on line 0&quot;</strong> sah. Jeder Seitenaufruf erzeugte diesen Fehler. Die installierten Pakete (php5-cgi + Module sowie apache2 + Module) entstammen dem offiziellen Debian Etch Repository, das Problem betrifft also wahrscheinlich auch noch viele weitere Systeme, bei denen nicht ständig ins Error-Log geschaut wird. Wahrscheinlich wird beim Start des php-cgi Prozesses noch eine andere Konfigurationsdatei als <em>/etc/php5/cgi/php.ini</em>, mit der Anweisung das Modul zu laden, ausgelesen.</p>
<p>Beheben lässt sich das Problem durch das Editieren von <em>/etc/php5/cgi/php.ini</em>. Dort die Zeile, die das json-Modul lädt, einfach auskommentieren und den Apache neustarten.</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/module-json-already-loaded-in-unknown-on-line-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>phpDocumentor bei SVN commit starten</title>
		<link>http://nerdcenter.de/phpdocumentor-bei-svn-commit-starten/</link>
		<comments>http://nerdcenter.de/phpdocumentor-bei-svn-commit-starten/#comments</comments>
		<pubDate>Tue, 05 Aug 2008 18:58:48 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[Linux / Unix]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[phpdocumentor]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://www.nerdcenter.de/phpdocumentor-bei-svn-commit-starten/</guid>
		<description><![CDATA[

Was ist Code ohne Dokumentation? Genau: total daneben.
Zum Glück gibt es ja praktische Helfer wie phpDocumentor, um aus Kommentaren eine richtig anständige Dokumentation zu zaubern. Aber das verdammte Ding nach jedem SVN commit anzustoßen ist auf Dauer ganz schön nervig&#8230;
Abhilfe verspricht der post-commit hook. In dem Wurzelverzeichnis jedes SVN Repositorys befindet sich ein Verzeichnis namens [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Was ist Code ohne Dokumentation? Genau: total daneben.</p>
<p>Zum Glück gibt es ja praktische Helfer wie <strong>phpDocumentor</strong>, um aus Kommentaren eine richtig anständige Dokumentation zu zaubern. Aber das verdammte Ding nach jedem <strong>SVN commit</strong> anzustoßen ist auf Dauer ganz schön nervig&#8230;</p>
<p>Abhilfe verspricht der <strong>post-commit hook</strong>. In dem Wurzelverzeichnis jedes SVN Repositorys befindet sich ein Verzeichnis namens hooks. Dort können beliebige ausführbare Dateien hinterlegt werden, die je nach deren Dateinamen zu einem bestimmten Zeitpunkt ausgeführt werden (Beispiele / Templates sind bereits in dem Verzeichnis enthalten).<br />
Um phpDocumentor nach einem erfolgreichen SVN commit zu starten kann man ein Bash-script verwenden, indem man diesem den Dateinamen post-commit verpasst und das Executebit setzt (chmod +x foo).</p>
<p>Der Ablauf im Script ist dann wie folgt:<br />
1. SVN checkout anwerfen<br />
2. phpdoc -d anwerfen<br />
3. Quellcode löschen (bei Bedarf)</p>
<p>Das Script bekommt bei seinem Aufruf 2 Argumente: den absoluten Pfad zum betroffenen Repository sowie die Reversion nach dem commit.</p>
<p>Besonders praktisch finde ich daran die Möglichkeit den Quelltext zusammen mit der entsprechenden Dokumentation im Intranet zugänglich zu machen.</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/phpdocumentor-bei-svn-commit-starten/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mit FFmpeg Videos ins FLV Format konvertieren (PHP)</title>
		<link>http://nerdcenter.de/mit-ffmpeg-videos-ins-flv-format-konvertieren-php/</link>
		<comments>http://nerdcenter.de/mit-ffmpeg-videos-ins-flv-format-konvertieren-php/#comments</comments>
		<pubDate>Wed, 09 Jan 2008 18:27:37 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[Linux / Unix]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmierung]]></category>

		<guid isPermaLink="false">http://www.nerdcenter.de/mit-ffmpeg-videos-ins-flv-format-konvertieren-php/</guid>
		<description><![CDATA[

Wer seinen Usern die Möglichkeit geben möchte Videos hochzuladen und beim Abspielen Kompabilitäts-Probleme vermeiden möchte kommt um FLV (Flash Video) nicht vorbei, denn den Flash-Player hat eigentlich jeder installiert und aktiviert. Der Download eines extra Players bzw. Codecs entfällt so auch bei exotischeren Betriebssystemen.
Mit FFmpeg lassen sich diverse Videotypen in das FLV Format konvertieren. Da [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Wer seinen Usern die Möglichkeit geben möchte Videos hochzuladen und beim Abspielen Kompabilitäts-Probleme vermeiden möchte kommt um <strong>FLV</strong> (Flash Video) nicht vorbei, denn den Flash-Player hat eigentlich jeder installiert und aktiviert. Der Download eines extra Players bzw. Codecs entfällt so auch bei exotischeren Betriebssystemen.</p>
<p>Mit <strong>FFmpeg</strong> lassen sich diverse Videotypen in das FLV Format konvertieren. Da man aus PHP Skripten heraus beliebige Prozesse mit den Rechten des Benutzers, der <strong>PHP</strong> ausführt, starten kann, lässt sich FFmpeg auch sehr gut in einem PHP Skript verwenden um Videos direkt nach dem Upload automatisch zu <strong>konvertieren</strong>.</p>
<p><strong>1. Download, Kompilieren und Installation von LAME:</strong><br />
Auf <a href="http://sourceforge.net/project/showfiles.php?group_id=290&#038;package_id=309">Sourceforge</a> gehen und aktuellste Version auswählen, Download URL kopieren und per wget auf dem Server herunterladen, also z.B. <em>wget http://surfnet.dl.sourceforge.net/sourceforge/lame/lame-3.97.tar.gz</em><br />
Nach dem Download den Tarball mit <em>tar zxf lame-3.97.tar.gz</em> entpacken und mit <em>cd lame-3.97</em> in das Verzeichnis wechseln. Nun das Configure-Skript durchlaufen lassen, kompilieren und installieren: <em>./configure &#038;&#038; make &#038;&#038; sudo make install</em></p>
<p><strong>2. Download, Kompilieren und Installation von FFmpeg:</strong><br />
<a href="http://ffmpeg.mplayerhq.hu/ffmpeg-export-snapshot.tar.bz2">FFmpeg Sources runterladen</a>: <em>wget http://ffmpeg.mplayerhq.hu/ffmpeg-export-snapshot.tar.bz2</em> , mit <em>tar jxf ffmpeg-export*</em> entpacken. Jetzt das Configure-Skript durchlaufen lassen, kompilieren und installieren: <em>./configure &#8211;enable-libmp3lame &#038;&#038; make &#038;&#038; sudo make install</em></p>
<p><strong>3. FFmpeg von PHP aus starten:</strong><br />
<em>&lt;?php<br />
system(&#8221;/usr/local/bin/ffmpeg  -i input.mov -ar 22050 -ab 56 -aspect 4:3 -b 200 -r 12 -f flv -s 320&#215;240 -acodec mp3 -ac 1 output.flv&#8221;);<br />
?&gt;</em></p>
<p>Tipp: Wenn FFmpeg den Start verweigert weil es libmp3lame.so.0 nicht finden konnte muss das Configure-Skript von LAME mit &#8211;prefix=/usr aufgerufen werden.</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/mit-ffmpeg-videos-ins-flv-format-konvertieren-php/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
