2012年11月1日 星期四

FFmpeg tutorial practice - tutorial04

在Tutorial04裡,主要是修改一些 Coding 方式,主要使用不同的 threads 來處理 Video 和 Audio,一方面讓程式架構較模組化,另一方面是為了之後 Video/Audio 同步之用。如果有從 Tutorial01 一直實驗上來,大概要改的東西都在前面講過了,下面就列出,我花了比較久的時間的部份。

有一段程式碼是為了結束程式所要使用的

// will interrupt blocking functions if we quit!
url_set_interrupt_cb(decode_interrupt_cb);

int decode_interrupt_cb(void) {
    return (global_video_state && global_video_state->quit);
}

但是因為 url_set_interrupt_cb 在 FFmpeg-1.0 中已經不再使用了,所以要改成下面的方式

int decode_interrupt_cb(void *ctx) {
    return (global_video_state && global_video_state->quit);
}

static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };

pFormatCtx->interrupt_callback = int_cb;



其中 AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL } 要宣告在全域範圍,pFormatCtx->interrupt_callback = int_cb 就在 main() 裡指定。

另外有2個函式也必須修改

url_ferror(&pFormatCtx->pb)

要改成

pFormatCtx->pb->error



pstrcpy(is->filename, sizeof(is->filename), argv[1]);

要改成

av_strlcpy(is->filename, argv[1], sizeof(is->filename));

有時候改程式的時候,真的要小心點,我在驗證功能時,不小心把某一行程式註解掉了,但是一樣可以正常編譯,執行的時候卻發現一直有問題,找了好久才發現。

沒有留言:

張貼留言