在編寫能夠適配 h264 和 h265 編碼的MP4播放器時遇到的問題.(PS如果iOS系統(tǒng)播放器能夠滿足這一點(diǎn)我也不至于會累成狗).于是有了以下的嘗試.
- 完美解析播放 本地mp4 (h264編碼)
- 完美解析播放 本地mp4 (h265編碼)
- 解析網(wǎng)絡(luò)mp4 (海鳥)
視頻地址 http://vjs.zencdn.net/v/oceans.mp4 卡頓超級嚴(yán)重 - 解析網(wǎng)絡(luò)mp4 (馴龍高手)
視頻地址 http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4 播放順暢 - 解析網(wǎng)絡(luò)mp4 這邊是找了一個h265編碼的視頻.不好找呀.我這里也是限時才有的 播放順暢
ffmpeg 用avformat_open_input() 解析網(wǎng)絡(luò)流時.默認(rèn)是阻塞線程, 解析錯誤或其他原因的長時間不返回.
為 avformat_open_input() 函數(shù)設(shè)置stimeout 的參數(shù) (單位微妙)
設(shè)置interrupt_callback和timeout . 能解決這些問題
設(shè)置超時時間timeout
//設(shè)置一些參數(shù)
// AVDictionary * options = NULL;
/*
//設(shè)置緩存大小利赋,1080p可將值調(diào)大
//以udp方式打開嗅义,如果以tcp方式打開將udp替換為tcp
//設(shè)置超時3秒 設(shè)置超時斷開連接時間,單位微秒
//設(shè)置最大時延
*/
// av_dict_set(&options, "buffer_size", "1024000", 0);
// av_dict_set(&options, "rtsp_transport", "tcp", 0);
// av_dict_set(&options, "stimeout", "3000000", 0);
// av_dict_set(&options, "max_delay", "500000", 0);
// pFormatCtx->probesize = 100 *1024;
// pFormatCtx->max_analyze_duration = 5 * AV_TIME_BASE;
AVDictionary * opts = NULL;
av_dict_set(&opts, "rtsp_transport", "tcp", 0);
av_dict_set(&opts, "stimeout", "2000000", 0);
avformat_open_input 阻塞處理 interrupt_callback
static int decode_interrupt_cb(void *ctx)
{
return 1; // return 1 時會立刻結(jié)束阻塞
}
//建議這么寫
static int decode_interrupt_cb(void *ctx)
{
exit_info * is = ctx;
if (is->nExit == 1) {
OOLog(@"終止rtsp >>>>>>>>>>>>>>>>>>> is->nExit = 1");
}
return is->nExit;
}
想結(jié)束時 is->nExit = 1; 就好了
formatCtx->interrupt_callback.callback = decode_interrupt_cb;
formatCtx->interrupt_callback.opaque = is;
當(dāng)然也有說avformat_open_input 能設(shè)置成非阻塞的 (設(shè)置后貌似沒效果,建議不用)
formatCtx->flags |= AVFMT_FLAG_NONBLOCK;