ffmpeg處理斷網時,生成一個檔案中遇到的問題
由於網路環境不穩定,在實際的錄影過程中常常會將錄製的檔案儲存為多個視訊檔案,後期就需要更多的資源來進行視訊合併,並且增加了額外的時間開銷。為了解決這個問題,同時考慮到時間的開銷以及資源佔用率最小,就想出了這樣的一個辦法,在斷網時,av_read_frame()會在達到超時後,返回一個負值,由於同一個攝像機裡面的引數都一致,可以沿用前面設定的引數,後面只需要再次開啟流,不停的檢查是否能連通,連通後將對應的視訊流和音訊流寫入到對應的位置中。
在檢測流是否連通過程中,需要不斷的對avformatcontext分配記憶體,為了避免記憶體溢位,需要分配一次,就釋放一次。測試發現,當呼叫avformat_open_input()失敗時,下一次分配記憶體時,並沒有增加額外的記憶體開銷,因此就不需要擔心記憶體溢位的情況。
測試程式碼如下:
#include<iostream>
#include<thread>
extern "C"{
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswresample/swresample.h>
#include <libavutil/avstring.h>
#include <libavutil/pixfmt.h>
#include <libavutil/samplefmt.h>
#include <libavutil/channel_layout.h>
#include "MP4Encoder.h"
#include<malloc.h>
#include<Windows.h>
}
using namespace std;
bool state=false;
AVFormatContext *ifmt=NULL;
/*
返回 -1失敗,0成功
*/
int InitInputRtspStream(const char* url,AVFormatContext *ic)
{
AVDictionary* options = NULL;
av_dict_set(&options,"rtsp_transport", "tcp", 0);
av_dict_set(&options,"stimeout","5000000",0);
if(avformat_open_input(&ic,url,NULL,&options)!=0)
return -1;
if(avformat_find_stream_info(ic,NULL)<0)
return -1;
//顯示輸入流資訊
printf("-----------rtsp流輸入資訊--------------\n");
av_dump_format(ic, 0, url,0);
printf("---------------------------------------\n");
printf("\n");
return 0;
}
void test()
{
int ret=-1;
int i=0;
while(!state)
{
i++;
av_register_all();
avformat_network_init();
ifmt=avformat_alloc_context();
printf("---第%d次 分配地址%0x 記憶體大小:%d\n",i,ifmt,sizeof(*ifmt));
ret=InitInputRtspStream("rtsp://admin:[email protected]:554",ifmt);
if(ret>=0)
{
avformat_close_input(&ifmt);
}
printf("***第%d次 分配地址%0x 記憶體大小:%d\n",i,ifmt,sizeof(*ifmt));
}
}
void main()
{
state=false;
thread task(test);
task.detach();
printf("輸入按鍵停止\n");
getchar();
state=true;
printf("退出程式\n");
getchar();
}
測試結果
相關推薦
ffmpeg處理斷網時,生成一個檔案中遇到的問題
由於網路環境不穩定,在實際的錄影過程中常常會將錄製的檔案儲存為多個視訊檔案,後期就需要更多的資源來進行視訊合併,並且增加了額外的時間開銷。為了解決這個問題,同時考慮到時間的開銷以及資源佔用率最小,就想出了這樣的一個辦法,在斷網時,av_read_frame()會在
h5 網絡斷網時,返回上一個頁面 demo (與檢測網絡代碼相結合,更直觀看到結果)
oct width 加載 doctype lin 測試 htm mini offline 頁面一: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8">
web工程啟動時,在一個類中延遲載入Bean,因為該Bean類可能還沒被JVM載入
問題描述: (1)javaWeb專案啟動中,還沒啟動完成,在下面這個類載入另一個Bean類, (2)通過getBean方法獲取到該Bean,可以獲取到,不為null (3)但是,呼叫該Bean的方法insertSelective()方法,進不去該方法 &nb
請寫一個python邏輯,計算一個檔案中的大寫字母數量
import os os.chdir(r'C:\Users\Administrator\Desktop')#os.chdir切換到指定目錄 with open('a.txt') as today: count=0 for i in today.re
python學習之網站的編寫(HTML,CSS,JS)(十一)----------如何利用其它html檔案中的CSS(也就是可以將共同的地方提取出來,放大一個檔案中,利於使用)
首先說一下它的具體用處,我們已經知道,當我們寫一個html檔案的時候,不同的標籤想用相同的版式的時候,我們可以將它提取出來,然後再用一些選擇器進行應用,比如class選擇器。但是,但我們編寫多個html檔案中的時候,多個檔案都想用一些相同的版式該怎麼辦呢? 那麼就引入了這種連線的方式,首先寫一個
C++學習筆記,關於一個檔案中的全域性變數在其他檔案中的使用
錯誤:多重定義 和 xxx變數已經在xxx.obj中定義 當在一個.cpp檔案中定義了一個全域性變數之後,需要在其他檔案中使用時,需要用到關鍵字extern 當使用extern修飾一個變數時,例如extern int x; 代表當前變數x 的定義來自於其他檔案,當進行
在做vue計算屬性,v-for處理數組時遇到的一個bug
this 解決 就是 com 渲染 fault post return 我想 問題 bug: You may have an infinite update loop in a component render function 無限循環 需要處理的數組(在 ** ssq
php使用新浪雲Storage儲存上傳下載檔案,建立bucket、Bucket 操作、Object 上傳操作,Object 下載操作,Object 刪除操作、Object 複製操作,生成一個外網能夠訪
<?php //新浪雲 Storage PHP use use sinacloud\sae\Storage as Storage; // 方法一:在新浪雲執行環境中時可以不傳認證資訊,預設會從應用的環境變數中取 $s = new Storage();
解析XML時DTD的處理--解析時忽略,生成XML檔案時加上
一、解析XML檔案時,遇到DTD的定義要怎麼辦? 下面這段程式碼是ibatis配置檔案,用w3c Dom(其實任意一種解析方式都是這樣)都會從http://www.ibatis.com/dtd/sql-map-config-2.dtd 這 個地址找對應的DTD檔案進行校驗,如果因特網上這個地址
Mac 使用natapp,Nginx內網穿透,生成外網可訪問域名
以下內容基於Mac ##natapp使用 使用natapp工具,官網連結https://natapp.cn 下載完成後,根據官方教程進行配置,連結如下: https://natapp.cn/article/natapp_newbie 下載下來的檔案不可直接執行,先執行chmod
處理物件陣列時,根據某個屬性名相同,求某一項的和。
當我們從後臺得到資料格式如下,我們需要求每個使用者money的和,就可以這樣做。 var arry = [ {user_id:1,money:100}, {user_id:2,money:33}, {user_
C#匯出 Excel 時, 生成 CheckBox 控制元件
在使用 Microsoft.Office.Interop.Excel 元件匯出Excel 表格時,要把匯出前的 CheckBox 控制元件一同匯出到 excel 表格中,對於這個功能 看似很簡單,但 Microsoft.Office.Interop
【教程】解決小米筆記本Pro連線無線網時,出現WiFi閃一下然後無網路問題
造成原因: 周邊5GWiFi過多。 解決: 改變網絡卡接收的頻段: 一:此電腦->右擊選擇管理 二:選擇裝置管理器 三:點開網路配適器-->選擇第三個右擊-->屬性-->高階 四:選擇80
QtEmbedded-4.8.6-arm 編譯選擇從 動態庫變化到靜態庫 時,生成的Makefile連結庫路徑下如果有動態庫和靜態庫,優先選擇動態庫編譯應用
問題:QtEmbedded-4.8.6-arm 編譯選擇從 動態庫到靜態庫 時,發現的一個疑惑:,生成的Makefile連結庫路徑下如果有動態庫和靜態庫,優先選擇動態庫編譯應用 具體現象: 我最初是使用動態庫的 QtEmbedded-4.8.6-arm (編譯器選擇時,是 ./co
模仿事物,一個功能執行不成功時,另一個也不能執行
double d = 0; double f = 1; double g = d / f;
IOT-15893 多個遙控器時,在一個遙控器上設定控制裝置,使用另一個遙控器也可控制
這個bug改了我一天半的時間 真的是絞盡腦汁 首先是因為公司產品A8遙控器功能分為組1 組2 組1-2 三個組,而遙控器是屬於離線裝置無法上報資料 ,我們app在新增到遙控器的時候 給他設定三個groupID ,但是因為之前的機制太亂 會出現groupID給重複,引起的不同遙控器groupID卻是相
TV_指定遙控器方向鍵盤的上下左右被按下時,下一個獲得焦點控制元件的控制元件
android:nextFocusUp- 定義當點up鍵時,哪個控制元件將獲得焦點 android:nextFocusDown-定義當點down鍵時,哪個控制元件將獲得焦點 android:nextFocusLeft-定義當點left鍵時,哪個控制元件將獲得焦點 android:nextFo
傳值到介面,生成一個下拉框
得到一個裝港id和卸港id,然後在介面的生成一個下拉框,這個很簡單的。但是不熟練,記一下,下次直接複製。 var portId = obj.children('td').eq(5).html()+"";//卸港id var loadingPortId = obj.children('td').eq(
那些方法在執行時動態生成一個java類
一:java compiler 可以對類進行編譯,生成位元組碼 也可以直接操作位元組碼。比如asm ,javasist ,cglib 二: 位元組碼和類載入怎麼無縫轉化的? 用到了,java 底層的 defineclass 方法,將java位元組碼 byte [] 進行載入。 動態代理也是位元組碼操
多執行緒執行時,如果一個邏輯需要等若干個執行緒執行完成後再執行,怎麼實現?
實際開發過程中,尤其是大型的業務系統中或批量處理系統中,我們通常會用到多執行緒來進行任務拆分,來提高系統的處理能力。當對業務不斷拆分時,多執行緒各自任務之間也形成了錯綜複雜的關係。 我們常常遇到這樣的情況,業務模組A 拆分成了 A1 、A2.....An個多執行緒,來提高處理速度,可是 Ak(1<k&