Saturday, May 30, 2015

Transcoding : How ffmpeg works

Sebelum membahas Transcoding, pastikan Anda mengerti apa beda Transcoding dengan Encoding. Lebih jelas di artikel ini.

Untuk belajar lebih detail tentang transcoding, kita langsung ke tools yang sangat populer yang digunakan untuk transcoding yaitu FFMPEG.

Berikut adalah diagram cara kerja FFMPEG:



Terlihat di gambarh bawah ada 5 jenis proses di FFMPEG yaitu:
1. Demux: memisahkan antara stream video, stream audia, stream caption, dll
2. Decode: mengubah compressed video ke uncompressed video (frame-frame gambar utuh)
3. Filter: melakukan editing frame-frame gambar dan menjdaikan uncompresed video
4. Encode: membuat uncompresed video dan audio menjadi compressed video
5. Mux: menggabungkan stream compresed video dengan compresed audio ke dalam container

Di gambar juga dijelaskan 3 jenis task yang bisa dilakukan:
1. Editing: mengedit frame-frame gambar (menggunakan filter option)
2. Transcoding: mengubah codec dengan melakukan decode kemudian encode
3. Change Container: mengubah container spt: mengubah mp4 menjadi ogg

Berikut ini diberikan contoh lengkap proses Transcoding + Editing:

ffmpeg -i 1280x720p.mp4 -filter:v "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" mirror.flv

Hasil Transcoding + Editing --> file: mirror.flv



Kurang lebih cara kerja ffmpeg sbb:

1. Pertama-tama ffmpeg membaca informasi file input 1280x720p.mp4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1280x720p.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.15.105
  Duration: 00:00:15.04, start: 0.036281, bitrate: 1990 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1859 kb/s, 24 fps, 24 tbr, 12288 tbn, 48 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

Terlihat bahwa file tsb tersebut terdiri dari 2 stream: Compressed Video (Stream #0:0(und): Video: h264 (High)) dan Compressed Audio ( Stream #0:1(und): Audio: aac (LC)).

2. Proses DEMUX memisahkan ke dua stream tsb.

3. Selanjutnya di lakukan proses DECODE menggunakan codec yang sesuai yaitu Video menggunakan decoding h264 dan Audio menggunakan decoding aac. Proses ini menghasilkan Raw Video (dalam bentuk frame-frame bitmap uncompressed) dan Raw Audio (dalam bentuk PCM).

4. Selanjutnya terjadi proses Editing (di ffmpeg proses ini di lakukan modul FILTER). Perintah -filter:v "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" merupakan perintah untuk melakukan Editing (pada modul Filter).

Proses filter tsb: lakukan split video menjadi main dan tmp. Lalu tmp di crop 1/2 bagian atas. Setelah itu balikkan (flip) video tsb. Lalu lakukan overlay (tempel) video hasil flip tsb ke 1/2 bagian bawah video main.

INGAT: proses filter (editing) hanya bisa terjadi pada uncompressed video dan audio.

5. Setelah proses filter selesai maka terbentuk Video baru yang uncompressed. Proses selanjutnya adalah melakukan ENCODING dari uncompressed video ke compressed video. Diperlukan codec disini.

Karena file output adalah FLV, maka codec yang digunakan adalah  codec flv1 (library flv).

Output #0, flv, to 'mirror.flv':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.15.105
    Stream #0:0(und): Video: flv1 (flv) ([2][0][0][0] / 0x0002), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 24 fps, 1k tbn, 24 tbc (default)
    Metadata:
      handler_name    : VideoHandler
      encoder         : Lavc56.15.100 flv
    Stream #0:1(und): Audio: mp3 (libmp3lame) ([2][0][0][0] / 0x0002), 44100 Hz, stereo, fltp (default)
    Metadata:
      handler_name    : SoundHandler
      encoder         : Lavc56.15.100 libmp3lame

6. Selanjutnya setelah file compressed video dan audio terbentuk, kedua file tsb di gabung dengan proses MUX untuk masuk ke dalam container FLV

Mapping proses MUX sbb:

Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> flv1 (flv))
  Stream #0:1 -> #0:1 (aac (native) -> mp3 (libmp3lame))

Stream #0:0 (stream input pertama pada file input pertama) dimapping dari h264 ke Stream #0:0(stream output pertama pada file output pertama) dengan codec flv

Stream #0:1 (stream input kedua pada file input pertama) diubah dari aac ke Stream #0:1 (stream output kedua pada file output pertama) dengan codec mp3




No comments: