Penempatan di Aliran
[Fitur yang terkait dengan halaman ini, AVIFile Functions dan Macros, adalah fitur warisan. Ini telah digantikan oleh Pembaca Sumber. Pembaca Sumber telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru, jika memungkinkan, menggunakan Pembaca Sumber daripada Fungsi AVIFile dan Makro. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]
AVIFile menyediakan beberapa cara untuk menemukan dan pindah ke posisi dalam aliran data. Fungsi dan makro di bagian ini memungkinkan aplikasi Anda menemukan posisi awal, panjang, dan bingkai kunci (berisi gambar lengkap dalam sampel) dalam aliran. Fungsi dan makro juga mengaitkan waktu dengan posisi dalam aliran dengan menghitung waktu yang berlalu yang diperlukan untuk memutar aliran dari awal hingga titik mana pun dalam aliran.
Menemukan Posisi Awal
Anda dapat mengambil nomor sampel dari bingkai pertama dalam aliran video dengan menggunakan fungsi AVIStreamStart. (Bingkai film mungkin dimulai pada sampel 0 atau 1, tergantung pada preferensi penulis.) Anda juga dapat memperoleh informasi ini dengan menggunakan fungsiAVIStreamInfo. Fungsi ini menyimpan nomor sampel dalam anggota dwStart dari struktur AVISTREAMINFO. Anda dapat mengambil waktu mulai sampel pertama aliran dengan menggunakan makroAVIStreamStartTime.
Anda dapat mengambil panjang aliran dengan menggunakan fungsiAVIStreamLength. Fungsi ini mengembalikan jumlah sampel dalam aliran. Anda juga dapat memperoleh informasi ini dengan menggunakan fungsi AVIStreamInfo. Fungsi ini menyimpan panjang aliran dalam anggota dwLength dari struktur AVISTREAMINFO. Untuk mengambil panjang aliran dalam milidetik, gunakan makroAVIStreamLengthTime.
Dalam aliran video, setiap cuplikan umumnya sesuai dengan frame video. Namun, mungkin ada sampel di mana tidak ada data video. Jika Anda memanggil fungsiAVIStreamReadyang menentukan salah satu posisi tersebut, fungsi tersebut mengembalikan panjang data 0 byte. Anda dapat menemukan sampel yang berisi data dengan menggunakan fungsiAVIStreamFindSample dan menentukan bendera FIND_ANY.
Dalam aliran audio, setiap sampel sesuai dengan satu blok data data audio. Misalnya, jika data audio memiliki format ADPCM (Modulasi Kode Pulse Diferensial Adaptif) 22 kHz, setiap sampel untuk AVIStreamLength sesuai dengan blok 256 byte data audio terkompresi. Blok data audio ini berisi sekitar 500 sampel audio saat tidak dikompresi. Namun, fungsi dan makro AVIFile memperlakukan setiap blok 256-byte sebagai satu sampel.
Nota
Posisi yang valid dalam rentang aliran berkisar dari awal hingga akhir aliran, yang merupakan penjumlahan dari titik awal aliran dan panjangnya. Posisi yang diwakili oleh jumlah posisi awal dan panjangnya sesuai dengan waktu setelah data terakhir dirender; tidak berisi data apa pun. Anda dapat mengambil nomor sampel yang mewakili akhir aliran dengan menggunakan makroAVIStreamEnd. Anda dapat mengambil nilai waktu dalam milidetik yang mewakili akhir aliran dengan menggunakan makro AVIStreamEndTime.
Menemukan Sampel dan Bingkai Kunci
Anda dapat mencari berbagai jenis sampel dalam aliran dengan menggunakan fungsiAVIStreamFindSample. Fungsi ini mencari mundur atau maju melalui aliran untuk sampel jenis yang sesuai, dimulai dengan nomor sampel yang Anda tentukan. Anda dapat mencari berbagai jenis sampel dalam aliran dengan menentukan penanda dalam urutan panggilan AVIStreamFindSample. Tentukan bendera FIND_ANY untuk menemukan sampel yang tidak kosong atau untuk melewati sampel yang tidak memiliki data. Tentukan bendera FIND_KEY untuk mencari bingkai kunci yang berisi data untuk merender gambar lengkap tanpa perlu mereferensikan bingkai sebelumnya. Tentukan bendera FIND_FORMAT untuk mencari perubahan pada format. AVIStreamFindSample digunakan terutama dengan aliran video.
Beberapa makro yang menggunakan fungsi AVIFile melengkapi fitur pencarian aliran. Daftar berikut ini menyediakan deskripsi singkat tentang setiap makro. Makro yang mencari posisi atau jenis data tertentu mengharuskan lokasi awal ditentukan dalam aliran.
Makro | Deskripsi |
---|---|
AVIStreamIsKeyFrame | Menunjukkan apakah sampel dalam aliran tertentu adalah frame kunci. |
AVIStreamNearestKeyFrame | Menemukan bingkai kunci pada atau sebelum posisi tertentu dalam aliran. |
AVIStreamNearestKeyFrameTime | Menentukan waktu yang sesuai dengan awal frame kunci terdekat (pada atau sebelum) waktu yang ditentukan dalam sebuah aliran. |
AVIStreamNearestSample | Menemukan sampel terdekat yang tidak kosong pada atau sebelum posisi yang ditentukan dalam aliran. |
AVIStreamNearestSampleTime | Menentukan waktu yang sesuai dengan awal sampel yang terdekat dengan waktu yang ditentukan dalam arus data. |
AVIStreamNextKeyFrame | Menemukan bingkai kunci berikutnya dengan mengikuti posisi yang ditentukan dalam aliran. |
AVIStreamNextKeyFrameTime | Mengembalikan waktu bingkai kunci berikutnya dalam aliran, dimulai pada waktu tertentu. |
AVIStreamNextSample | Menemukan sampel yang tidak kosong berikutnya dari posisi tertentu dalam alur. |
AVIStreamNextSampleTime | Mengembalikan waktu ketika perubahan sampel terjadi ke sampel berikutnya dalam aliran. |
AVIStreamPrevKeyFrame | Menemukan bingkai kunci yang mendahului posisi tertentu di dalam stream. |
AVIStreamPrevKeyFrameTime | Mengembalikan waktu bingkai kunci sebelumnya dalam aliran, dimulai pada waktu tertentu. |
AVIStreamPrevSample | Menemukan sampel yang tidak kosong yang mendahului posisi tertentu dalam aliran data. |
AVIStreamPrevSampleTime | Menentukan waktu di mana sampel sebelumnya menggantikan pendahulunya di aliran. |
AVIStreamSampleToSample | Mengembalikan sampel dalam aliran yang terjadi pada saat yang sama dengan sampel yang terjadi di aliran kedua. |
Beralih Antara Sampel dan Waktu
Anda dapat menentukan waktu yang berlalu dari awal aliran ke sampel menggunakan fungsiAVIStreamSampleToTime. Fungsi ini mengonversi nomor sampel menjadi nilai waktu yang dinyatakan dalam milidetik. Untuk bingkai video (yang mencakup beberapa milidetik), nilai ini mewakili waktu sampel mulai diputar sejak pemutaran dimulai dan mengasumsikan klip video diputar dengan kecepatan normal. Untuk sampel audio (yang memiliki beberapa sampel dalam milidetik), nilai waktu sesuai dengan waktu di mana sampel mulai diputar dan mengasumsikan aliran audio diputar pada kecepatan normal.
Sebaliknya, Anda dapat menemukan nomor sampel yang terkait dengan nilai waktu dengan menggunakan fungsiAVIStreamTimeToSample. Fungsi ini mengonversi nilai milidetik menjadi nomor sampel dan mengasumsikan klip video diputar pada kecepatan normal.
Karena AVIStreamSampleToTime mengembalikan waktu di mana bingkai mulai diputar, hubungan antara AVIStreamSampleToTime dan AVIStreamTimeToSample tidak sepenuhnya bersifat kebalikan. Mereka menentukan posisi dalam file lebih akurat daripada mereka menentukan waktu. Misalnya, dua sampel audio berturut-turut dapat terpancar dalam milidetik yang sama. Menggunakan AVIStreamSampleToTime untuk mengonversi nomor sampel akan menghasilkan nilai waktu yang identik. Jika Anda mengonversi nilai waktu kembali ke nomor sampel dengan menggunakan AVIStreamTimeToSample, satu sampel akan dirujuk.