cocoa touch-转码mp3格式时显示进度条。

问题描述

转码mp3格式时显示进度条。

使用 LAME 将.caf音频文件编码为.mp3文件。

只有一个问题,需要计算转换文件的时间,用UIProgressView给用户显示转换进度,这点实现不了。

NSArray *dirPaths;
NSString *docsDir;

dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
_mp3FilePath = [docsDir stringByAppendingPathComponent:@"file.mp3"];

NSString* cafFile = [[NSBundle mainBundle] pathForResource:@"background" ofType:@"caf"];
char cstr[512] = {0};
[cafFile getCString:cstr maxLength:512 encoding:NSASCIIStringEncoding];
@try {
    int read, write;
    FILE *pcm = fopen([cafFile cStringUsingEncoding:1], "rb");
    FILE *mp3 = fopen([_mp3FilePath cStringUsingEncoding:1], "wb");
    const int PCM_SIZE = 8192;
    const int MP3_SIZE = 8192;
    short int pcm_buffer[PCM_SIZE*2];
    unsigned char mp3_buffer[MP3_SIZE];

    lame_t lame = lame_init();
    lame_set_in_samplerate(lame, 44100);
    lame_set_VBR(lame, vbr_default);
    lame_init_params(lame);

    NSFileManager *fileManger = [NSFileManager defaultManager];
    NSData *data = [fileManger contentsAtPath:cafFile];
    NSString* str = [NSString stringWithFormat:@"%d K",[data length]/1024];
    NSLog(@"size of caf=%@",str);

    printf("Using LAME v%sn", get_lame_version());

    do {
        read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm);
        if (read == 0)
            write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
        else
            write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);

        fwrite(mp3_buffer, write, 1, mp3);

    } while (read != 0);

    lame_close(lame);
    fclose(mp3);
    fclose(pcm);
}
@catch (NSException *exception) {
    NSLog(@"%@",[exception description]);
}
@finally {
    //Detrming the size of mp3 file
    NSFileManager *fileManger = [NSFileManager defaultManager];
    NSData *data = [fileManger contentsAtPath:_mp3FilePath];
    NSString* str = [NSString stringWithFormat:@"%d K",[data length]/1024];
    NSLog(@"size of mp3=%@",str);
}

解决方案

我建议使用lame_set_num_samples ,像这样:

int sampleRate = 44100;
int bitsPerSample = 16;
int numberOfChannels = 2;
lame_t lame = lame_init();
lame_set_in_samplerate(lame, 44100);
lame_set_VBR(lame, vbr_default);
lame_init_params(lame);
NSString* cafFile = [[NSBundle mainBundle] pathForResource:@"background" ofType:@"caf"];
char cstr[512] = {0};
[cafFile getCString:cstr maxLength:512 encoding:NSASCIIStringEncoding];
int fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:cafFile error:nil] fileSize];
int duration = (fileSize * 8) / (sampleRate * bitsPerSample * numberOfChannels);
lame_set_num_samples(lame, (duration * sampleRate));
lame_get_num_samples(lame);
int percent     = 0;
int samp_rate   = lame_get_out_samplerate(lame);
int frameNum    = lame_get_frameNum(lame);
int totalframes = lame_get_totalframes(lame);

if (frameNum < totalframes) {
        percent = (int) (100. * frameNum / totalframes + 0.5);
    }
    else {
        percent = 100;
    }
float progress = (float) percent/100;
dispatch_async(dispatch_get_main_queue(), ^{
       self.percentageLabel.text = [NSString stringWithFormat:@"%d%%",percent];
       self.progressBar.progress =  progress;

    });
时间: 2024-08-24 15:50:02

cocoa touch-转码mp3格式时显示进度条。的相关文章

如何实现将datagridview的内容保存成excel时显示进度条

问题描述 各位大虾:请问如何在保存数据到excel的过程中显示保存的进度条那.我现在讲datagridview的内容保存到excel时总是会卡顿很久,线做一个进度条显示保存的进度.但是不知道怎么弄,求指点!注意:需要真实显示保存的进度状态. 解决方案 解决方案二:保存时如果你是遍历grid,那就加个progressbar就是了解决方案三:引用楼主guangzi8531的回复: 各位大虾:请问如何在保存数据到excel的过程中显示保存的进度条那.我现在讲datagridview的内容保存到exce

在线等!。net导出excel时显示进度条

问题描述 从datagrid中提取数据时,因为数据量过大,所以导致弹出保存提示框的时候页面一直在响应过程中,用户希望界面友好,加入进度条,如果很复杂,给一个动态GIF的页面中间提示,直到弹出保存框,GIF结束.谢谢最好有代码,网上找了好多,都不行. 解决方案 解决方案二:谢谢来一个人好心人帮忙下.解决方案三: 解决方案四:感觉CSDN的人越来越少了....解决方案五:这个我做过.你必须提前计算出大概要导出多少行..然后写一个操作进度条的委托,一旦跑了n行调用一些这个委托让进度条走.最终当所有行走

在ASP处理程序时显示进度

用过软件的朋友都知道,进度条是一个优秀软件的重要组成部分.它的存在能够使用户及时掌握程序的运行进度,确认应用程序正常工作.可是ASP中似乎没有上述标准控件,控制起来也比较麻烦. 那幺如何实现进度条呢? 以下是本人的一些观点(仅供参考) 我们通常在用ASP处理程序(指的是写文件或操作数据库)的时候,会专门用一个页面(*.asp)去处理或控制这些程序,当处理完毕的时候再跳转到显示页面.这时我们就可以通过这些处理页面显示进度条.其方法是根据程序处理的进度依次画一百张同样的图形(如有颜色的矩形),从而形

在ASP处理程序时显示进度_应用技巧

用过软件的朋友都知道,进度条是一个优秀软件的重要组成部分. 它的存在能够使用户及时掌握程序的运行进度,确认应用程序正常工作.可是ASP中似乎没有上述标准控件,控制起来也比较麻烦. 那幺如何实现进度条呢? 以下是本人的一些观点(仅供参考) 我们通常在用ASP处理程序(指的是写文件或操作数据库)的时候,会专门用一个页面(*.asp)去处理或控制这些程序,当处理完毕的时候再跳转到显示页面.这时我们就可以通过这些处理页面显示进度条.其方法是根据程序处理的进度依次画一百张同样的图形(如有颜色的矩形),从而

网页加载时页面显示进度条加载完成之后显示网页内容_javascript技巧

现在网上有很多网页加载进度条 ,但大多都是时间固定的. 下面的当查询大量数据时,网页加载较慢,在网页加载时,显示进度条,当网页加载完成时,进度条消失,显示网页已经加载完成的内容. 复制代码 代码如下: <html> <script language=VBScript> Dim Bar, SP Bar = 0 SP = 100 Function Window_onLoad() Bar = 95 SP = 10 End Function Function Count() if Bar

Asp.Net 无刷新文件上传并显示进度条的实现方法及思路

相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦苦来 实现呢?我并不否认"拿来主义",只是我个人更喜欢凡是求个所以然.本篇将阐述通过Html,IHttpHandler和 IHttpAsyncHandler实现文件上传和上传进度的原理,希望对你有多帮助. 效果图: 本文涉及到的知识点: 1.前台用到Html,Ajax,JQuery,JQuery UI 2.后台用到一般处理程序(IHttpHandler)

swing 下载文件时的进度条

Java swing中经常要使用到进度条,比如下载文件和拷贝文件时显示进度,如下图所示:  下载完成之后: 难点在于:在读取输入流的时候,实时更新进度条.  我自己定了一个规则: (1) 若输入流的大小小于1024,则字节数组的长度就是输入流的大小. <!--[if !supportLists]-->(1)      (2) <!--[endif]-->获取文件的大小,并平分为100等份,得到商1: <!--[if !supportLists]-->(2)       

progressbar-ashx+easyui如何实现上传文件时的进度条

问题描述 ashx+easyui如何实现上传文件时的进度条 我前端用的easyui的filebox,才用form提交方式,后台是ashx,以流方式读取文件并以二进制形式保存在数组实现了文件上传功能,但我现在还需要进度条,请问我该用什么方法实现进度条,谢谢. 解决方案 Servlet实现上传文件进度条JAVA实现显示上传文件进度条PHP 大文件上传进度条实现 解决方案二: 见百度.要积分.见百度.要积分.对不起 解决方案三: 利用xmlhttprequest对象 解决方案四: xmlhttpreq

关于开一新进程显示进度条的问题

问题描述 本人C#新手,网上找到一段代码适合VB.net的,如下:#Region"---------------再开一个线程显示进度条---------------"PrivateSubwaitstart()Me.Cursor=Cursors.WaitCursorBackgroundWorker1.RunWorkerAsync()EndSubPrivateSubwaitend()BackgroundWorker1.CancelAsync()Me.Cursor=Cursors.Defau