Videohosting, en vooral het converteren, is een vak apart inderdaad.
Converteren:
De meest goedkope manier is inderdaad ffmpeg, maar dit is ook meteen de meest foutgevoelige. Tenzij het echt om weinig video's gaat, kun je het outsourcen naar een SaaS-converter (Software as a Service) zoals
Zencoder. Toen ik zelf bezig was met dit soort zaken was dit een vrij goedkope en vooral goede encoder. Je zet een video online en geeft de locatie op aan Zencoder. Hierbij krijg je dan ook nog extra mogelijkheden zoals thumbnails (meerdere, of zelfs 10 thumbnails + 'poster thumbnail', zodat je een leuke previewimage en een animated gif preview hebt). Anyway, je maakt dan met bijvoorbeeld php het volgende:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
| $aRequest = array(
'api_key' => ENCODING_APIKEY,
'input' => 'http://'.$_SERVER['HTTP_HOST'].'/encode/'.$sFilename,
'region' => 'europe',
'outputs' => array(
array(
'label' => 'Universal_Smartphone',
'video_codec' => 'h264',
'base_url' => ENCODING_OUTPUT_BASEURL,
'filename' => $sFileWithoutExt.'.mp4',
'size' => '480x320',
'video_bitrate' => 1500,
'keyframe_interval' => 50,
'notifications' => array(
array(
'format' => 'json',
'url' => ENCODING_NOTIFICATION_URL
)
),
'watermark' => array(
'url' => ENCODING_WATERMARK_URL,
'x' => '-20',
'y' => '4'
)
),
array(
'label' => 'Legacy_Mobile',
'format' => '3gp',
'video_codec' => 'mpeg4',
'base_url' => ENCODING_OUTPUT_BASEURL,
'filename' => $sFileWithoutExt.'.3gp',
'size' => '320x240',
'aspect_mode' => 'pad',
'frame_rate' => 15,
'upscale' => true,
'video_bitrate' => 192,
'keyframe_interval' => 50,
'bitrate_cap' => 192,
'audio_bitrate' => 24,
'audio_channels' => 1,
'audio_sample_rate' => 16000,
'notifications' => array(
array(
'format' => 'json',
'url' => ENCODING_NOTIFICATION_URL
)
),
'watermark' => array(
'url' => ENCODING_WATERMARK_URL,
'x' => '-20',
'y' => '4'
)
),
array(
'label' => 'Flash',
'base_url' => ENCODING_OUTPUT_BASEURL,
'filename' => $sFileWithoutExt.'.flv',
'keyframe_interval' => 50,
'video_codec' => 'vp6',
'audio_codec' => 'aac',
'audio_bitrate'=> 160,
'width' => 640,
'notifications' => array(
array(
'format' => 'json',
'url' => ENCODING_NOTIFICATION_URL
)
),
'thumbnails' => array(
array(
'base_url' => ENCODING_OUTPUT_BASEURL,
'number' => 16,
'size' => '160x120',
'prefix' => 'thumb_'.$sFileWithoutExt
),
array(
'base_url' => ENCODING_OUTPUT_BASEURL,
'number' => 1,
'size' => '640x480',
'prefix' => 'poster_'.$sFileWithoutExt,
'format' => 'jpg'
)
),
'watermark' => array(
'url' => ENCODING_WATERMARK_URL,
'x' => '-20',
'y' => '4'
)
)
)
); |
Hiermee vang je al een groot gedeelte van je gebruikers af, maar je betaald wel 3x voor je video. Zencoder vraagt geen geld voor 'incoming', zodat je de best mogelijke kwaliteit kan opsturen. Je kunt deze settings uiteraard ook gebruiken als je handmatig wil converteren, een drietal conversies zou dan genoeg moeten zijn.
Zoals je ziet kun je een notify url-locatie opgeven, zodra je video klaar is krijg je een seintje welke conversie klaar is, en dit kun je dan met bijvoorbeeld php afvangen en de video via ftp laten uploaden op je site. Zo heb je er dus verder geen omkijken meer naar. Het nadeel is wel dat je inlogcredentials van een ftp-account plaintext meestuurt met het initiele request.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
| /*
* Ignore user abort
*/
ignore_user_abort(true);
// output message and flush
ob_start();
// hier kan je dan wat echo'en ->
// komt in je zencoder admin panel te staan, niet perse nodig
/*
* Send headers so we can end the connection
*/
header("Connection: close\r\n");
header("Content-Encoding: none\r\n");
header("Content-Length: " .ob_get_length());
// be sure to flush after doing your business
ob_end_flush();
ob_end_clean();
session_write_close();
/*
* Zencoder has a pretty small timeout range.
To counter this we just say we received it, close the connection and handle the rest.
*/
/*
* Parse response
*/
$aResponse = (Array)json_decode(trim(file_get_contents('php://input')), true);
/*
inputarray(2) {
["job"]=>
array(3) {
["test"]=> bool(true)
["state"]=> string(8) "finished"
["id"]=> int(305075)
}
["output"]=>
array(4) {
["url"]=> string(47) "ftp://encoder:h$R&5q#F8fb2@HOSTNAME.COMOFIP/16.flv"
["state"]=> string(8) "finished"
["label"]=> string(5) "Flash"
["id"]=> int(393261)
}
}
*/ |
Dit is code uit mijn project, dus wellicht dat je dan de code wat moet veranderen
Streaming / Hosting:
Je kunt dit op meerdere manieren doen. Als je een vps hebt, of dedicated/colocated dan kun je zelf software installeren die dit voor je doet. Ikzelf ben bezig geweest met onder andere
Red5. Dit pakket wordt niet enorm vaak meer geupdate, maar ik zie dat begin dit jaar nog een update is geweest. Je kunt ook kiezen voor Streaming-software van Apple, maar daar betaal je wel de hoofdprijs voor.
Voor FLV had ik gekozen voor Lighttpd met mod_flv_streaming en er is ook een mod_mp4_streaming, maar die kost wat meer moeite om werkend te krijgen. Hierin zit wat basic stuff zoals throttling en met mod_secdownload kun je tijdelijke urls naar deze files maken. Ze zijn dan bijvoorbeeld hooguit een uur te linken voordat de url niet meer werkt.
Er zijn zeer veel manieren om te bereiken wat je wil, maar als je er geen geld aan wil uitgeven kan het een vrij saaie bezigheid zijn
Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.