青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

socketref,再見!高德

https://github.com/adoggie

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

常用鏈接

留言簿(54)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

寫代碼,寫好代碼其實并不難,但如果要做好文檔,能完整闡述清楚自己的構思、想法和邏輯結構,這比較難,自己也缺少這方面的耐心。
很多opensource的代碼根本不需要文檔也能一目了然,這是一種定力
多年前的項目中使用到python和ffmpeg, 網絡上搜索了一下,均不能滿足自己的要求。ffmpeg的python綁定提供的均是文件級的訪問控制,也就是說沒有暴露更多的可控接口來用。
所以還是一切都自己來做
ffmpeg采用0.81版本以上,當時發現mov文件在0.71以下無法正常解碼,到0.81則解決了此問題。
python包裝ffmpeg的方式很多,最好的可能就是swig,但太煩了,最后選擇ctypes來訪問ffmpeg接口。 
如果直接使用ffmpeg的api接口也不太合適,因為要暴露很多ffmpeg的接口、數據類型、常數定義等。
所以我是這么處理:   
  1. 編寫一個功能動態庫來包裝ffmpeg,提供基本的業務功能 ,屏蔽ffmpeg細節,這里叫ffmpeg_media_codec.dll
  2. 用ctypes包裝此ffmpeg_media_codec.dll,這里是ffmpeg.py
  3. 業務代碼使用ffmpeg.py提供的接口訪問、解碼多媒體文件 
代碼: http://sw2us.com/static/projects/py-ffmpeg/

ffmpeg_media_codec.dll 暴露的c接口 

 1 ffmpeg lib interface list:
 2 ===========================
 4 typedef unsigned char  StreamByte_t;
 6 struct MediaStreamInfo_t{
 7     int codec_type;
 8     int codec_id;
 9     int width;
10     int height;
11     int gopsize;
12     int pixfmt;
13     int tb_num;
14     int tb_den;
15     int bitrate;
16     int frame_number;
17     int videostream; //視頻流編號
18 };
19 
20 struct MediaVideoFrame_t{
21     StreamByte_t *    rgb24;
22     size_t            size;
23     int                width;
24     int                height;
25     unsigned int    sequence; //控制播放順序
26     unsigned int    duration; //播放時間
27 };
28 
29 struct MediaPacket_t{
30      StreamByte_t*    data;
31      size_t            size;
32     AVPacket    *    pkt;
33     int                stream;    //流編號 
34     int                dts;
35     int                pts;
36     size_t            sequence;
37     size_t            duration;
39 };
40 
41 struct MediaFormatContext_t;
42 
43 //解碼器
44 struct MediaCodecContext_t{
45     AVCodecContext * codecCtx;    //AVCodecContext*
46     AVCodec *        codec;    
47     int                stream; //流編號
48     AVFrame *        rgbframe24; //
49     AVFrame*        frame;    //
50     StreamByte_t*    buffer;
51     size_t            bufsize;
52     void *            user;
53     MediaStreamInfo_t si;
54 };
55 
56 struct MediaFormatContext_t{
57     AVFormatContext * fc; //AVFormatContext* 
58     MediaStreamInfo_t video;    //視頻信息
60 };
66 #ifdef __cplusplus
67  extern "C" {  
68 #endif
69 
70 int InitLib();         //初始化解碼庫
71 void Cleanup();    //
73 MediaCodecContext_t* InitAvCodec(MediaStreamInfo_t* si);    //根據媒體類型分配解碼器對象
74 void FreeAvCodec(MediaCodecContext_t* codec);                  //釋放解碼器對象
76 MediaVideoFrame_t * DecodeVideoFrame(MediaCodecContext_t* ctx,MediaPacket_t* pkt);  //送入媒體包進行解碼,返回視頻幀
77 void FreeVideoFrame(MediaVideoFrame_t* frame);                  //釋放視頻幀
79 MediaPacket_t * AllocPacket();                                             //分配一個流媒體包對象(用于網傳)
80 void FreePacket(MediaPacket_t* pkt);                                    //釋放流媒體包
82 MediaFormatContext_t* InitAvFormatContext(char * file);          //媒體文件訪問上下文,申請
83 void FreeAvFormatContext(MediaFormatContext_t* ctx);          //釋放
84 MediaPacket_t* ReadNextPacket(MediaFormatContext_t* ctx);   //讀媒體文件一個數據包
85 void ReadReset(MediaFormatContext_t* ctx) ;                //重置媒體訪問讀取位置
86 int SeekToTime(int timesec) ;                                     //跳躍到指定時間

ffmpeg.py 包裝:

  1 import ctypes
  2 from ctypes import *

  5 _lib = cdll.LoadLibrary('ffmpeg.dll')
  6 
  7 _int_types = (c_int16, c_int32)
  8 if hasattr(ctypes, 'c_int64'):
  9     # Some builds of ctypes apparently do not have c_int64
 10     # defined; it's a pretty good bet that these builds do not
 11     # have 64-bit pointers.
 12     _int_types += (ctypes.c_int64,)
 13 for t in _int_types:
 14     if sizeof(t) == sizeof(c_size_t):
 15         c_ptrdiff_t = t
 16 
 17 class c_void(Structure):
 18     # c_void_p is a buggy return type, converting to int, so
 19     # POINTER(None) == c_void_p is actually written as
 20     # POINTER(c_void), so it can be treated as a real pointer.
 21     _fields_ = [('dummy', c_int)]

 26 class MediaStreamInfo_t(Structure):
 27     _fields_ = [
 28         ('codec_type', c_int),
 29         ('codec_id', c_int),
 30         ('width', c_int),
 31         ('height', c_int),
 32         ('gopsize', c_int),
 33         ('pixfmt', c_int),
 34         ('tb_num',c_int),
 35         ('tb_den',c_int),
 36         ('bitrate',c_int),
 37         ('frame_number',c_int),
 38         ('videostream',c_int),
 39         ('duration',c_int),
 40         ('extr',POINTER(c_char)), #解碼器 額外hash表數據
 41         ('extrsize',c_int),
 42     ]
 43 
 44 class MediaVideoFrame_t(Structure):
 45     _fields_=[
 46         ('rgb24',POINTER(c_char)),
 47         ('size',c_uint),
 48         ('width',c_int),
 49         ('height',c_int),
 50         ('sequence',c_uint),
 51         ('duration',c_uint)
 52     ]
 53     
 54 class MediaPacket_t(Structure):
 55     _fields_=[
 56         ('data',POINTER(c_char)),
 57         ('size',c_uint),
 58         ('pkt',c_char_p),
 59         ('stream',c_int),
 60         ('dts',c_int),
 61         ('pts',c_int),
 62         ('sequence',c_uint),
 63         ('duration',c_uint)
 64     ]
 65     
 66     
 67 class MediaCodecContext_t(Structure):
 68     _fields_=[
 69         ('codecCtx',c_char_p),
 70         ('codec',c_char_p),
 71         ('stream',c_int),
 72         ('rgbframe24',c_char_p),
 73         ('frame',c_char_p),
 74         ('buffer',c_char_p),
 75         ('bufsize',c_uint),
 76         ('user',c_char_p),
 77         ('si',MediaStreamInfo_t)
 78     ]    
 79     
 80 class MediaFormatContext_t(Structure):
 81     _fields_=[
 82         ('fc',c_char_p),
 83         ('video',MediaStreamInfo_t)
 84     ]
 85     
 86 InitAvCodec = _lib.InitAvCodec
 87 InitAvCodec.restype = POINTER(MediaCodecContext_t)
 88 InitAvCodec.argtypes = [POINTER(MediaStreamInfo_t)]
 89 
 90 
 91 FreeAvCodec = _lib.FreeAvCodec
 92 FreeAvCodec.restype = None
 93 FreeAvCodec.argtypes = [POINTER(MediaCodecContext_t)]
 96 DecodeVideoFrame = _lib.DecodeVideoFrame
 97 DecodeVideoFrame.restype = POINTER(MediaVideoFrame_t)
 98 DecodeVideoFrame.argtypes = [POINTER(MediaCodecContext_t),POINTER(MediaPacket_t)]
100 FreeVideoFrame = _lib.FreeVideoFrame
101 FreeVideoFrame.restype = None
102 FreeVideoFrame.argtypes = [POINTER(MediaVideoFrame_t)]  
104 AllocPacket = _lib.AllocPacket
105 AllocPacket.restype = POINTER(MediaPacket_t)
106 AllocPacket.argtypes = []
109 FreePacket = _lib.FreePacket
110 FreePacket.restype = None
111 FreePacket.argtypes = [POINTER(MediaPacket_t),c_int]
113 InitAvFormatContext = _lib.InitAvFormatContext
114 InitAvFormatContext.restype = POINTER(MediaFormatContext_t)
115 InitAvFormatContext.argtypes = [c_char_p]
117 FreeAvFormatContext = _lib.FreeAvFormatContext
118 FreeAvFormatContext.restype = None
119 FreeAvFormatContext.argtypes = [POINTER(MediaFormatContext_t)]
122 ReadNextPacket = _lib.ReadNextPacket
123 ReadNextPacket.restype = POINTER(MediaPacket_t)
124 ReadNextPacket.argtypes = [POINTER(MediaFormatContext_t)]
127 ReadReset = _lib.ReadReset
128 ReadReset.restype = None
129 ReadReset.argtypes = [POINTER(MediaFormatContext_t)]
130 
131 SeekToTime = _lib.SeekToTime
132 SeekToTime.restype = c_int
133 SeekToTime.argtypes = [POINTER(MediaFormatContext_t),c_int]
134 
135 FlushBuffer = _lib.FlushBuffer
136 FlushBuffer.restype =None
137 FlushBuffer.argtypes = [POINTER(MediaCodecContext_t)]
138 
139 InitLib = _lib.InitLib
140 InitLib.restype =None
141 InitLib.argtypes = []
142 
143 Cleanup = _lib.Cleanup
144 Cleanup.restype =None
145 Cleanup.argtypes = []

好了,看看如何使用這些接口 
視頻文件播放:      http://sw2us.com/static/projects/py-ffmpeg/test_qt.py
posted on 2014-04-14 22:35 放屁阿狗 閱讀(5879) 評論(2)  編輯 收藏 引用

Feedback

# re: py-ffmpeg在python中利用ctype包裝的ffmpeg以提供流控制 2014-04-14 22:37 春秋十二月
如果要做好文檔,能完整闡述清楚自己的構思、想法和邏輯結構,這比較難
--我非常認同這句話,作為一個真正的程序員,不僅要會寫程序,還要會寫文檔,缺一不可。  回復  更多評論
  

# re: py-ffmpeg在python中利用ctype包裝ffmpeg 2014-04-14 23:31 放屁阿狗
首先是心態,不要讓自己毛躁起來,還有就是環境,畢竟在國內,急功近利是一種普遍的病態  回復  更多評論
  


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            另类综合日韩欧美亚洲| 亚洲欧美综合国产精品一区| 亚洲午夜精品在线| 亚洲黄一区二区| 欧美在线观看视频| 久久爱www久久做| 久久成人一区| 久久偷看各类wc女厕嘘嘘偷窃| 久久精品国产亚洲aⅴ| 久久av红桃一区二区小说| 新67194成人永久网站| 午夜精品久久久久久久99樱桃| 亚洲视频免费| 午夜精品一区二区三区四区| 久久狠狠久久综合桃花| 久久久www成人免费精品| 开心色5月久久精品| 欧美激情一区二区三级高清视频| 亚洲国产一成人久久精品| 欧美激情片在线观看| 日韩视频在线一区二区三区| 亚洲一区二区视频| 久久九九免费视频| 欧美日韩aaaaa| 国产一区二区三区免费观看| 亚洲精品国产精品国自产观看浪潮| 一本一本a久久| 亚洲最快最全在线视频| 久久精品亚洲| 国内自拍一区| 日韩午夜免费| 欧美制服第一页| 免费成人高清在线视频| 亚洲精品美女免费| 欧美在线观看www| 欧美人与禽性xxxxx杂性| 国产在线一区二区三区四区| 一卡二卡3卡四卡高清精品视频 | 午夜视频一区在线观看| 久久xxxx精品视频| 欧美精品久久久久久久久老牛影院| 国产精品尤物福利片在线观看| 亚洲第一主播视频| 久久九九电影| 亚洲影音一区| 欧美日韩国产限制| 亚洲国产精品v| 久久精品国产精品 | 国产乱人伦精品一区二区 | 久久综合伊人77777蜜臀| 国产精品久久久久一区二区三区 | 亚洲毛片播放| 欧美一区=区| 欧美日韩精品免费| 亚洲精品久久久久久久久| 巨乳诱惑日韩免费av| 欧美亚洲综合久久| 国产精品久久久久久久电影| 亚洲精品国产精品国自产在线| 久久综合网hezyo| 久久久九九九九| 韩日欧美一区二区| 久热精品在线| 老色鬼精品视频在线观看播放| 国产亚洲精品久久久久婷婷瑜伽| 午夜亚洲影视| 欧美一区二区观看视频| 韩日欧美一区二区| 欧美aaa级| 欧美激情第一页xxx| 亚洲人精品午夜| 亚洲精品美女免费| 国产精品成人免费精品自在线观看| 亚洲视频福利| 亚洲欧美日本另类| 一区二区亚洲欧洲国产日韩| 伊人一区二区三区久久精品| 久久九九99视频| 久久久久久久久综合| 欧美在线网站| 久久九九99视频| 美女视频黄 久久| 一本色道久久精品| 一区二区三区高清| 国产午夜精品美女视频明星a级| 欧美在线一二三| 久久久噜噜噜久久中文字免| 亚洲人www| 中文日韩在线视频| 国内精品嫩模av私拍在线观看| 久久精品91| 看欧美日韩国产| 亚洲图片在线观看| 亚洲一级特黄| 一色屋精品视频在线看| 亚洲欧洲三级| 国产欧美二区| 亚洲高清资源| 国产精品户外野外| 久久综合九色综合网站| 亚洲人成网在线播放| 一区二区三区**美女毛片| 国产免费成人av| 亚洲风情在线资源站| 欧美日韩国产一区精品一区| 久久精品国亚洲| 欧美日韩和欧美的一区二区| 久久久高清一区二区三区| 欧美成人自拍| 欧美在线视频观看| 日韩午夜视频在线观看| 国产亚洲亚洲| 欧美日韩久久久久久| 亚洲一区bb| 久久久久久久999| 亚洲欧美网站| 欧美黑人在线观看| 久久久另类综合| 国产精品福利片| 91久久视频| 国产亚洲欧美一区| 99re66热这里只有精品4| 在线视频观看日韩| 香蕉尹人综合在线观看| 在线亚洲欧美视频| 欧美大片一区| 久久综合中文| 国产在线一区二区三区四区 | 欧美成人综合在线| 国产精品红桃| 夜夜嗨av色综合久久久综合网| 在线精品高清中文字幕| 亚洲一区二区在线免费观看视频| 一区二区国产日产| 久久久精品国产免大香伊 | 亚洲午夜久久久久久久久电影院| 亚洲女人av| 欧美不卡视频| 久久免费国产精品| 国产一区日韩一区| 亚洲综合视频一区| 中日韩美女免费视频网址在线观看| 欧美h视频在线| 亚洲国产精品成人一区二区| 极品日韩久久| 久久久久一区二区三区| 欧美亚洲综合久久| 国产精品久久久一区麻豆最新章节 | 极品少妇一区二区| 久久精品国产精品亚洲综合 | 性欧美1819性猛交| 亚洲美女av电影| 欧美成人精品一区| 亚洲电影在线观看| 亚洲日本中文| 欧美激情在线观看| 1024成人网色www| 9i看片成人免费高清| 欧美高清你懂得| 亚洲人成人一区二区在线观看| 日韩视频在线你懂得| 欧美日韩国产a| 亚洲免费播放| 欧美一区二区三区电影在线观看| 国产欧美日韩在线观看| 香蕉久久精品日日躁夜夜躁| 久久精品一区二区国产| 国产一区二区三区四区老人| 欧美一区二区三区在线视频| 久久香蕉国产线看观看av| 欧美黄色aaaa| 一二三区精品福利视频| 欧美在线观看一区| 激情一区二区| 欧美日本一道本| 中文欧美在线视频| 免费的成人av| 亚洲天堂成人| 激情六月婷婷久久| 欧美激情在线有限公司| 亚洲在线日韩| 韩国成人理伦片免费播放| 欧美夫妇交换俱乐部在线观看| 一区二区欧美国产| 久久在线视频在线| 亚洲一区二区免费在线| 国产乱码精品一区二区三区av| 久久躁狠狠躁夜夜爽| 日韩小视频在线观看| 欧美一区亚洲二区| 亚洲另类视频| 国产亚洲欧美日韩美女| 欧美日韩综合久久| 久久午夜电影| 久久久久五月天| 欧美激情aⅴ一区二区三区| 亚洲欧美99| 欧美国内亚洲| 欧美在线www| 一区二区三区欧美在线|