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

JACKY_ZZ[貓貓愛吃魚]

春風拂面兩頰紅,秋葉灑地一片金。 夏荷搖曳一身輕,冬雪覆蓋大地銀。
posts - 30, comments - 123, trackbacks - 0, articles - 0

[C/C++] ffmpeg_play on ubuntu 9.10

Posted on 2009-12-07 16:24 jacky_zz 閱讀(1815) 評論(8)  編輯 收藏 引用
在Windows XP上安裝VMware6.5,下載最新的Ubuntu 9.10桌面版安裝到虛擬機上。系統(tǒng)安裝完成后,設置網絡,從http://ffmpeg.org上下載最新的源碼版本,以root身份解壓到根目錄上,得到目錄ffmpeg-0.5,運行以下命令:
#cd ffmpeg-0.5
#./configure --prefix=/usr --enable-shared --disable-static --enable-memalign-hack
#make
#make install
#make distclean(可選)
完成編譯和安裝后,開始編碼,代碼如下:
  1#include <unistd.h>
  2#include <fcntl.h>
  3#include <sys/types.h>
  4#include <sys/ioctl.h>
  5#include <linux/soundcard.h>
  6#include <stdio.h>
  7#include <stdlib.h>
  8#include <libavcodec/avcodec.h>
  9#include <libavformat/avformat.h>
 10#include <libavutil/mem.h>
 11
 12#define BLOCK_SIZE 4608
 13
 14typedef struct AudioState
 15{
 16    AVFormatContext* pFmtCtx;
 17    AVCodecContext* pCodecCtx;
 18    AVCodec* pCodec;
 19
 20    #ifdef OUTPUT_INFORMATS
 21    AVInputFormat* ifmt;
 22    #endif
 23
 24    uint8_t* audio_buf1;
 25    uint8_t* audio_buf;
 26    unsigned int audio_buf_size;
 27    unsigned int buffer_size;
 28    int audio_buf_index;
 29    AVPacket audio_pkt_temp;
 30    AVPacket audio_pkt;
 31    uint8_t* audio_pkt_data;
 32    int audio_pkt_size;
 33    int stream_index;
 34}
 AudioState;
 35
 36int audio_decode_frame(AudioState* pState);
 37int read_buffer(AudioState* pState, void* buffer, int buf_size);
 38
 39int main(int argc, char* argv[])
 40{
 41    int err = 0;
 42    int handle = 0;
 43    int i = 0;
 44    int status = 0;
 45    int args = 0;
 46    int index = 0;
 47    int sample_rate = 0, bits_per_sample = 0, channels = 0;
 48    int done = 0;
 49    char buffer[BLOCK_SIZE] = {0};
 50    AudioState state;
 51    int buffer_size = (AVCODEC_MAX_AUDIO_FRAME_SIZE * 3/ 2;
 52    
 53    if(argc == 1)
 54    {
 55        printf("%s <filename>\n", argv[0]);
 56        return 0;
 57    }

 58
 59    // register all codecs.
 60    av_register_all();
 61    memset(&state, 0sizeof(AudioState));
 62    state.audio_buf1= (uint8_t*)av_mallocz(buffer_size);
 63    state.buffer_size = buffer_size;
 64
 65#ifdef OUTPUT_INFORMATS
 66    state.ifmt = av_iformat_next(NULL);
 67    for( ; ; )
 68    {
 69        if(!state.ifmt)
 70            break;
 71
 72        printf("%s [%s] [%s]\n", state.ifmt->name, state.ifmt->long_name,
 73            state.ifmt->extensions);
 74        state.ifmt = av_iformat_next(state.ifmt);
 75    }

 76#endif
 77
 78    err = av_open_input_file(&state.pFmtCtx, argv[1], NULL, 0, NULL);
 79    if(err < 0)
 80    {
 81        printf("can not open file %s.\n", argv[1]);
 82        return 0;
 83    }

 84
 85    err = av_find_stream_info(state.pFmtCtx);
 86    if(err < 0)
 87    {
 88        printf("can not find stream info of file %s.\n", argv[1]);
 89        return 0;
 90    }

 91
 92    for(i = 0; i < state.pFmtCtx->nb_streams; i++)
 93    {
 94        if(state.pFmtCtx->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO)
 95        {
 96            state.pCodecCtx = state.pFmtCtx->streams[i]->codec;
 97            index = i;
 98            state.stream_index = i;
 99            break;
100        }

101    }

102
103    if(!state.pCodecCtx)
104    {
105        printf("can not get codec context.\n");
106        av_close_input_file(state.pFmtCtx);
107
108        return 0;
109    }

110
111    state.pCodec = avcodec_find_decoder(state.pCodecCtx->codec_id);
112    if(!state.pCodec || avcodec_open(state.pCodecCtx, state.pCodec) < 0)
113    {
114        printf("can not open codec.\n");
115        av_close_input_file(state.pFmtCtx);
116
117        return 0;
118    }

119
120    sample_rate = state.pCodecCtx->sample_rate;
121    channels = state.pCodecCtx->channels;
122    switch(state.pCodecCtx->sample_fmt)
123    {
124        case SAMPLE_FMT_U8:
125            bits_per_sample = 8;
126            break;
127        case SAMPLE_FMT_S16:
128            bits_per_sample = 16;
129            break;
130        case SAMPLE_FMT_S32:
131            bits_per_sample = 32;
132            break;
133        default:
134            bits_per_sample = 16;
135    }

136
137    printf("sample_rate: %d Hz\n", sample_rate);
138    printf("channels: %d\n", channels);
139    printf("bits_per_sample: %d bit\n", bits_per_sample);
140
141    handle = open("/dev/dsp", O_RDWR);
142    if(handle < 0)
143    {
144        printf("can not open /dev/dsp.\n");
145        return 0;
146    }

147
148    args = sample_rate;
149    status = ioctl(handle, SOUND_PCM_WRITE_RATE, &args);
150    if(status == -1)
151    {
152        printf("SOUND_PCM_WRITE_RATE ioctl failed.\n");
153        return 0;
154    }

155
156    args = channels;
157    status = ioctl(handle, SOUND_PCM_WRITE_CHANNELS, &args);
158    if(status == -1)
159    {
160        printf("SOUND_PCM_WRITE_CHANNELS ioctl failed.\n");
161        return 0;
162    }

163
164    args = bits_per_sample;
165    status = ioctl(handle, SOUND_PCM_WRITE_BITS, &args);
166    if(status == -1)
167    {
168        printf("SOUND_PCM_WRITE_BITS ioctl failed.\n");
169        return 0;
170    }

171
172    for( ; ; )
173    {
174        int len = BLOCK_SIZE;
175        int size = 0;
176        char* pbuffer = buffer;
177        if(done)
178            break;
179
180        size = read_buffer(&state, buffer, len);
181        if(size == -1)
182        {
183            done = 1;
184            continue;
185        }

186
187        // printf("size=%d\n", size);
188        write(handle, buffer, size);
189    }

190
191    avcodec_close(state.pCodecCtx);
192    av_close_input_file(state.pFmtCtx);
193    av_free(state.audio_buf1);
194    close(handle);
195    return 0;
196}

197
198int audio_decode_frame(AudioState* pState)
199{
200    AVPacket* pkt_temp = &pState->audio_pkt_temp;
201    AVPacket* pkt = &pState->audio_pkt;
202    AVCodecContext* dec = pState->pCodecCtx;
203    int len = 0, data_size = 0;
204    int err = 0;
205
206    for( ; ; )
207    {
208        while(pkt_temp->size > 0)
209        {
210            data_size = pState->buffer_size;
211            len = avcodec_decode_audio2(dec, (int16_t*)pState->audio_buf1, &data_size, pkt_temp->data, pkt_temp->size);
212            if(len < 0)
213            {
214                pkt_temp->size = 0;
215                break;
216            }

217
218            pkt_temp->data += len;
219            pkt_temp->size -= len;
220
221            if(data_size <= 0)
222                continue;
223
224            pState->audio_buf = pState->audio_buf1;
225            return data_size;
226        }

227
228        if(pkt->data)
229            av_free_packet(pkt);
230
231        if((err = av_read_frame(pState->pFmtCtx, pkt)) < 0)
232            return -1;
233
234        pkt_temp->data = pkt->data;
235        pkt_temp->size = pkt->size;
236    }

237
238    return -1;
239}

240
241int read_buffer(AudioState* pState, void* buffer, int buf_size)
242{
243    int len = buf_size;
244    uint8_t* pbuffer = (uint8_t*)buffer;
245    int audio_size = 0;
246    int len1 = 0;
247    int size = 0;
248
249    while(len > 0)
250    {
251        if(pState->audio_buf_index >= pState->audio_buf_size)
252        {
253            audio_size = audio_decode_frame(pState);
254            if(audio_size < 0)
255                return (size > 0? size : -1;
256
257            pState->audio_buf_size = audio_size;
258            pState->audio_buf_index = 0;
259        }

260
261        len1 = pState->audio_buf_size - pState->audio_buf_index;
262        if(len1 > len)
263            len1 = len;
264
265        memcpy(pbuffer, (uint8_t*)pState->audio_buf + pState->audio_buf_index, len1);
266
267        len -= len1;
268        pbuffer += len1;
269        size += len1;
270        pState->audio_buf_index += len1;
271    }

272
273    return size;
274}
或者點擊此處下載源碼文件
編譯程序,運行命令:
#gcc ffmpeg_player.c -o ffmpeg_player -lavcodec -lavformat -lavutil
或者
#gcc -DOUTPUT_INFORMATS ffmpeg_player.c -o ffmpeg_player -lavcodec -lavformat -lavutil
編譯完成后,運行如下命令即可播放音樂文件了
#./ffmpeg_player /music/1.ape
ENJOY!

Feedback

# re: ffmpeg_play on ubuntu 9.10  回復  更多評論   

2009-12-08 13:08 by abettor
不錯,如果有個gtk或qt的圖形界面就更好了。

# 謝謝  回復  更多評論   

2009-12-12 12:59 by 謝謝
有時間能做一個 基于DirectShow 來做的頻譜分析示例來嗎,謝謝,820156394@qq.com

# re: ffmpeg_play on ubuntu 9.10  回復  更多評論   

2009-12-14 15:09 by jacky_zz
你提到的這個問題,在codeproject有例子的,無非需要做的自己開發(fā)一個Filter,并注冊到系統(tǒng),以便系統(tǒng)能以你開發(fā)的Filter來解碼輸入的文件,并將解碼數(shù)據(jù)返回給應用程序進行播放。
例子的地址為:http://www.codeproject.com/KB/audio-video/PeakMeterCS.aspx

# re: ffmpeg_play on ubuntu 9.10  回復  更多評論   

2009-12-14 16:06 by 820156394@qq.com
@jacky_zz
我都無語了,太感謝了,沒想到你給我回復的那么快
為了你的那個頻譜分析,我把我的DirectShow 項目變成了DirectSound的,然后幾乎全部的功能差不多都改好了,就差一個:滑動滾動條來控制歌曲播放位置

因為文件有MP3,wma,然后我試圖更改m_bytePosition出錯,還正在細看你的代碼,不知如何來做

# re: ffmpeg_play on ubuntu 9.10  回復  更多評論   

2009-12-14 22:26 by jacky_zz
你好,我現(xiàn)在都不想自己去寫具體格式的音頻解碼代碼了,我想采用ffmpeg作為解碼后臺,這樣做有幾個好處:一是可以把程序開發(fā)的重點從解碼轉移到程序架構的設計上來;二是ffmpeg支持的格式也比較多,這樣一來程序就可以播放多種格式的音頻文件了,我現(xiàn)在測試了aac,ape,flac,mp3,mp4,mpc,ogg,wma,wav,效果還不錯;三是編寫幾個封裝DLL,用于ffmpeg和DirectSound操作的封裝,這樣就越發(fā)模塊化了。呵呵,這個只是我的一個初步的想法,等封裝完成,那么剩下的工作就是界面編程了,有興趣的話,一起來整整?
PS:最近幾天準備用VC6來開發(fā)程序,在多個系統(tǒng)上測試,包括Ubuntu(9.10,Wine v1.01)。
我的QQ是:59502553。

# re: ffmpeg_play on ubuntu 9.10  回復  更多評論   

2009-12-18 10:57 by TS,MPEG2,dvbc專家
例子的地址為:http://www.codeproject.com/KB/audio-video/PeakMeterCS.aspx, 看了這個例子了,問你個事情 : 我的blog,http://m.shnenglu.com/dvb-dvb/ 有很多不理解的地方:

# re: ffmpeg_play on ubuntu 9.10  回復  更多評論   

2009-12-18 10:59 by TS,MPEG2,dvbc專家
482. jacky_zz (rss)
(7,12-08 09:37,5908) ,你排名靠后了,加油呀,

# re: ffmpeg_play on ubuntu 9.10  回復  更多評論   

2010-04-12 13:44 by 飛空靜渡
不錯,學習下,支持你一個
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲色无码播放| 久久综合狠狠综合久久综青草| 亚洲视频欧美视频| 91久久综合亚洲鲁鲁五月天| 亚洲高清在线观看| 亚洲国产人成综合网站| 亚洲国产一区二区三区a毛片| 在线国产日韩| 亚洲精华国产欧美| 亚洲精品综合久久中文字幕| 日韩亚洲视频在线| 亚洲视频自拍偷拍| 欧美日韩1080p| 欧美日韩一区二区三区免费| 欧美性猛交xxxx乱大交蜜桃| 国产精品一区二区久久久久| 黄色成人在线网址| 亚洲精品一区二区三区婷婷月 | 欧美成人免费在线| 亚洲欧洲日本mm| 亚洲国产精品一区在线观看不卡 | 久久成人精品视频| 老司机精品视频一区二区三区| 男女视频一区二区| 欧美视频你懂的| 国产一区二区在线观看免费| 最新69国产成人精品视频免费| 亚洲一区二区三区欧美| 久久米奇亚洲| 99精品视频网| 久久久久欧美| 国产精品激情av在线播放| 黄色欧美成人| 亚洲欧美另类在线观看| 欧美成年网站| 性久久久久久| 欧美吻胸吃奶大尺度电影| 在线电影国产精品| 性欧美videos另类喷潮| 亚洲黄色精品| 久久国产欧美日韩精品| 欧美日韩精品一区二区在线播放| 国模吧视频一区| 亚洲小说欧美另类社区| 欧美黄色aa电影| 欧美一区中文字幕| 国产精品久久二区| 日韩视频在线一区二区| 另类天堂视频在线观看| 亚洲欧美日韩精品在线| 欧美激情国产日韩| 有坂深雪在线一区| 久久精品免费| 午夜精品久久久久久久久 | 性欧美精品高清| 国产精品国产a| 一本色道久久综合亚洲精品小说| 欧美成人午夜免费视在线看片| 亚洲欧美一区二区原创| 欧美三区在线视频| 亚洲视频二区| 一区二区三区精品在线| 欧美午夜精品久久久久久久| av不卡在线看| 亚洲激情小视频| 91久久线看在观草草青青| 久久综合999| 亚洲成人资源网| 欧美电影免费观看| 久久综合伊人77777| 在线观看成人一级片| 久久综合色天天久久综合图片| 午夜一区二区三区不卡视频| 国产日韩欧美在线观看| 久久成人这里只有精品| 欧美在线一级va免费观看| 狠狠色狠狠色综合系列| 免费高清在线视频一区·| 麻豆亚洲精品| 日韩午夜激情| 亚洲午夜女主播在线直播| 国产欧美视频一区二区| 久久女同互慰一区二区三区| 久久婷婷成人综合色| 亚洲精品视频在线播放| 99re亚洲国产精品| 国产精品一页| 欧美jizz19性欧美| 欧美三日本三级少妇三2023| 久久久国产精品一区二区三区| 久久精品国产清高在天天线| 最近中文字幕mv在线一区二区三区四区| 亚洲黄色一区二区三区| 国产精品日韩欧美| 欧美成年视频| 国产精品久久久亚洲一区| 久久久之久亚州精品露出| 欧美成年人视频| 欧美在线观看一区二区三区| 久久女同精品一区二区| 亚洲调教视频在线观看| 久久精品国产一区二区三| 99国产精品一区| 欧美在线观看视频一区二区| 日韩视频二区| 久久精品成人欧美大片古装| 99国产精品久久久久久久久久| 午夜一级久久| 亚洲一区二区三区欧美| 久久精品国产亚洲aⅴ| 一区二区三区四区五区视频 | 久久久亚洲精品一区二区三区 | 亚洲国产精品ⅴa在线观看| 日韩一级二级三级| 怡红院精品视频在线观看极品| aaa亚洲精品一二三区| 亚洲国产精品日韩| 性色av香蕉一区二区| 亚洲午夜视频在线| 免费一级欧美片在线观看| 久久精品中文| 亚洲欧美国产高清va在线播| 亚洲国产黄色| 久久精品三级| 久久国产免费| 国产精品欧美一区喷水| 一本色道久久综合狠狠躁篇怎么玩 | 最新日韩中文字幕| 欧美一区二区三区成人| 亚洲免费在线视频一区 二区| 欧美国产激情| 亚洲第一精品夜夜躁人人爽| 国产一区欧美| 欧美一区二区三区免费视| 亚洲欧美一区二区激情| 欧美午夜激情视频| 在线天堂一区av电影| 亚洲图片激情小说| 欧美日韩在线播放一区二区| 亚洲精品久久久久中文字幕欢迎你 | 亚洲综合国产精品| 欧美午夜不卡在线观看免费| 亚洲精品网站在线播放gif| 亚洲精品视频二区| 欧美精品一区二区三区一线天视频 | 欧美日韩高清在线观看| 亚洲精品欧美一区二区三区| 日韩视频精品在线| 欧美国产另类| 日韩视频精品| 亚洲欧美日韩精品一区二区 | 99国产精品久久久| 欧美日韩一区二区三区高清| 亚洲视频一区二区免费在线观看| 亚洲一区二区三区高清不卡| 国产精品草莓在线免费观看| 亚洲女人天堂成人av在线| 久久精品日韩欧美| 尤物yw午夜国产精品视频明星| 欧美成人午夜视频| 99精品福利视频| 欧美呦呦网站| 亚洲成人在线视频播放| 欧美精品成人在线| 亚洲一区二区三区视频播放| 久久久久久成人| 亚洲人成网站影音先锋播放| 欧美日韩一区二区精品| 午夜精品久久久久久久99黑人| 免费视频一区| 亚洲午夜电影| 激情六月婷婷久久| 欧美精品一区二区三区蜜桃 | 欧美乱在线观看| 亚洲一区二区三区精品视频 | 国产精品国产自产拍高清av| 欧美在线视频免费观看| 欧美国产日韩在线| 亚洲深夜福利网站| 国产综合在线看| 欧美日韩精品二区| 欧美一区在线直播| 日韩亚洲精品在线| 久久久蜜桃一区二区人| 日韩亚洲视频在线| 韩国一区电影| 国产精品v日韩精品| 噜噜噜久久亚洲精品国产品小说| 一本色道久久综合亚洲精品高清| 久久久久91| 亚洲性感美女99在线| 影音先锋日韩资源| 国产麻豆成人精品| 欧美日本三区| 久久手机免费观看| 欧美在线观看一二区| 中文日韩欧美| 亚洲精选一区| 亚洲精品老司机| 欧美国产大片|