Friday, November 20, 2015

Pemanfaatan ffprobe

Untuk dapat melihat jenis Frame apakah I, P, atau B maka dapat digunakan ffprobe.

File: tswift.mp4 menggunakan fps 24 (apabila di check dengan ffmpeg -i).

Berikut adalah command untuk memeriksa frame-by-frame dari file tsb.

ffprobe -select_streams v -show_frames tswift.mp4 > detail-tswift.txt

Hasilnya sbb:

[FRAME] 
media_type=video
stream_index=0
key_frame=1
pkt_pts=0
pkt_pts_time=0.000000
pkt_dts=0
pkt_dts_time=0.000000
best_effort_timestamp=0
best_effort_timestamp_time=0.000000
pkt_duration=2
pkt_duration_time=0.041667
pkt_pos=77991
pkt_size=139064
width=1280
height=720
pix_fmt=yuv420p
sample_aspect_ratio=N/A
pict_type=I
coded_picture_number=0
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
[/FRAME]

[FRAME]
media_type=video
stream_index=0
key_frame=0
pkt_pts=2
pkt_pts_time=0.041667
pkt_dts=2
pkt_dts_time=0.041667
best_effort_timestamp=2
best_effort_timestamp_time=0.041667
pkt_duration=2
pkt_duration_time=0.041667
pkt_pos=217055
pkt_size=9241
width=1280
height=720
pix_fmt=yuv420p
sample_aspect_ratio=N/A
pict_type=P
coded_picture_number=1
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
[/FRAME]

Terlihat frame ke 1 (coded_picture_number=0), merupakan keyframe (pict_type=I atau key_frame=1),

Sedangkan frame ke 2 (coded_picture_number=1), merupakan P frame.

I Frame (key frame) berikutnya adalah di frame ke 61 (coded_picture_number=60)

[FRAME]
media_type=video
stream_index=0
key_frame=1
pkt_pts=120
pkt_pts_time=2.500000
pkt_dts=120
pkt_dts_time=2.500000
best_effort_timestamp=120
best_effort_timestamp_time=2.500000
pkt_duration=2
pkt_duration_time=0.041667
pkt_pos=1180981
pkt_size=137344
width=1280
height=720
pix_fmt=yuv420p
sample_aspect_ratio=N/A
pict_type=I
coded_picture_number=60
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
[/FRAME]

Apabila di lihat fps = 24, maka dalam 2.5 detik ada 2.5 x 24 = 60. Ini berarti:

Frame no 0 - 59 : GOP 1 (GOP duration: 2.5 detik)
Frame no 60 - 119 : GOP 2 (GOP duration: 2.5 detik)
Frame no 120 - 179: GOP 3 (GOP duration 2.5 detik)

Ingat bahwa GOP adalah jarak antara 2 keyframe (I-frame).

Apabila file tadi di transcode menjadi HLS (segmented .ts) maka ffmpeg akan membuat frame pertama pada setiap file segment .ts merupakan keyframe. Dalam 1 file .ts dapat terdiri dari 1 atau lebih keyframe. Dan apabila di periksa file asli tswift.mp4 tidak mengandung frame type B. Pada saat di conversi ke .ts maka terdapat kemungkinan file segmentnya berisi frame type B.

Apabila terdapat frame B, maka frame tsb mendahului beberapa frame P. Sebagai ilustrasi:
...
9. Frame 9: P
10. Frame 10: P
11. Frame 11: P
12. Frame 14: B
13. Frame 13: P
14. Frame 12: P
15. Frame 15: P
16. Frame 16: P
...

Seharusnya frame ke 12 adalah frame no 12. Tetapi dalam urutan penyimpanan picture atau frame, karena pada posisi ke 12 ini akan ditempati oleh frame type B (Bi Directional) maka frame 14 ini menempati tempat ke 12.

Lebih mendalam pembahasan tentang GOP menggunakan DVB Inspector bisa di baca di artikel ini.

PARAMETER FFPROBE LAIN

Hal yang bisa dilakukan untuk analisis TS adalah dengan menggunakan parameter berikut:

-show_frames : untuk menganalisis frame by frame
-show_packets : untuk menampilkan packet TS
-show_streams: untuk menampilkan jenis stream (video atau audio)

No comments: