ios-解码视频处理播放时只显示最后一帧图像,大家帮忙看看。。。

问题描述

解码视频处理播放时只显示最后一帧图像,大家帮忙看看。。。

-(void)translate
{
int videoStream= -1;
int frameFinished ;
uint8_t *buf;

avcodec_register_all();
avformat_network_init();
av_register_all() ;

if( avformat_open_input(&pFormatCtx, [fLocalFileName UTF8String], NULL, NULL) != 0)
{
    NSLog(@"av  open  input  file  failed!n");
    return ;
}
//从文件中提取流信息
if( avformat_find_stream_info(pFormatCtx, NULL) < 0 )
{
    NSLog(@"av  find  input  file  failed!n");
    return ;
}

//获取视频流
    if(   (videoStream = av_find_best_stream(pFormatCtx, AVMEDIA_TYPE_VIDEO, NULL, NULL, &pCodec, 0) )  < 0 )
    {
        NSLog(@"Cannot find a video stream in the input filen");
        return ;
    }
  //查找对应的解码器
pCodecCtx  = pFormatCtx->streams[videoStream]->codec ;
pCodec = avcodec_find_decoder( pCodecCtx->codec_id );
if( pCodec == NULL)
{
    NSLog(@"n");
    return ;
}
//打开编译解码器
if( avcodec_open2(pCodecCtx, pCodec, NULL) < 0 )
{
    NSLog(@"n");
    return ;
}
//为解码帧分配内存

pFrame = avcodec_alloc_frame();
if( pFrame== NULL )
{
NSLog(@"n");
return ;
}

// avpicture_alloc(&picture, PIX_FMT_RGB24, pCodecCtx->width, pCodecCtx->height );

buf = (uint8_t*)av_malloc( avpicture_get_size (PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height) );

if ( buf == NULL )
{
    printf( "av malloc failed!n");
    exit(1);
}
avpicture_fill ( &picture, buf, PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height);

// 设置图像转换上下文
static int sws_flags = SWS_FAST_BILINEAR;
img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, PIX_FMT_RGB24, sws_flags, NULL, NULL, NULL );

//不停地从码流中取出帧数据
while ( av_read_frame(pFormatCtx, &packet) >= 0 )
{
if( packet.stream_index == videoStream )
{
avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet );
if(frameFinished)
{
//转换图像格式
sws_scale (img_convert_ctx, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, picture.data, picture.linesize);

            //保存
            CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
            CFDataRef data = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, picture.data[0], picture.linesize[0]*pCodecCtx->height,kCFAllocatorNull);
            CGDataProviderRef provider = CGDataProviderCreateWithCFData(data);
            CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
            CGImageRef cgImage = CGImageCreate(pCodecCtx->width,
                                               pCodecCtx->height,
                                               8,
                                               24,
                                               picture.linesize[0],
                                               colorSpace,
                                               bitmapInfo,
                                               provider,
                                               NULL,
                                               NO,
                                               kCGRenderingIntentDefault);
            CGColorSpaceRelease(colorSpace);
            UIImage *image = [UIImage imageWithCGImage:cgImage];
            CGImageRelease(cgImage);
            CGDataProviderRelease(provider);
            CFRelease(data);
            [mutableImg  addObject: image];

// [img_Decode setImage:image];
}
}

    av_free_packet(&packet);
}

sws_freeContext(img_convert_ctx);
av_free(pFrame);
avcodec_close(pCodecCtx);
av_close_input_stream(pFormatCtx);

}

时间: 2024-08-05 02:28:47

ios-解码视频处理播放时只显示最后一帧图像,大家帮忙看看。。。的相关文章

浏览器如何使网页收藏时只显示图标

  浏览器收藏栏方便了我们浏览上网,点击一下就可以打开想要的网页,但是随着日积月累,收藏栏上的网站越来越多,占的很满,既不美观也影响使用,所以我们可以自定义标题宽度. 下面给大家介绍具体步骤. 第一步:打开ie浏览器,我们浏览器书签栏显示了书签的全标题. 第二步:在任意书签上右击,选择"自定义标题宽度". 第三步:系统给了三个选项,默认的是"长标题"项. 第四步:我们可以将其修改为"短标题",可以看到只显示了标题前部分,其余的以省略代替. 第五步

php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间_php实例

FFmpeg是一个视频插件,我们可以利用调用FFmpeg接口来获取视频的相关信息,包括视频的播放时长,视频的码率,视频的缩略图以及视频创建时间,本文章向大家介绍php如何使用FFmpeg接口获取视频信息,需要的朋友可以参考一下. FFmpeg获得视频文件的缩略图: function getVideoCover($file,$time,$name) { if(empty($time))$time = '1';//默认截取第一秒第一帧 $strlen = strlen($file); // $vid

创建C#窗体 当运行时只显示标题栏(如ENVI)

问题描述 创建C#窗体当运行时只显示标题栏(如ENVI) 解决方案 解决方案二:应该是工具栏吧解决方案三:没看明白,请lz再详细描述下你的需求呢?解决方案四:LZ你想干啥,只有标题栏的船体还有啥意义啊,单纯的为了显示标题?如果是想嵌入其他窗体的话,还不如搞成自定义控件解决方案五:需求不明确

如果让&amp;amp;lt;input type=&amp;amp;quot;file&amp;amp;quot; id=&amp;amp;quot;myFile&amp;amp;quot; runat=&amp;amp;quot;server&amp;amp;quot;&amp;amp;gt; 在点击浏览时只显示需要的文件格式(如:只显示*.jpg,*.gif,*.bmp)

问题描述 如果让<inputtype="file"id="myFile"runat="server">在点击浏览时只显示需要的文件格式(如:只显示*.jpg,*.gif,*.bmp)请教!! 解决方案 解决方案二:<inputtype="file"id="myFile"runat="server">调用的是客户端的文件夹浏览,应该是不能控制吧.解决方案三:Open

视频的播放-Android页面显示多个视频时如何控制声音显示哪个视频的声音

问题描述 Android页面显示多个视频时如何控制声音显示哪个视频的声音 最近开始学习Android,我试着在一个画面中画了3个视频,请问如何控制声音显示哪个视频的声音啊,我想要的效果是可以加入焦点进入,移动焦点在哪个视频上就显示哪个视频的声音.但是不知道如何实现.请大牛们帮忙~~~~

combobox中的项目通过adodc与access连接,但为什么选项不能及时更新,只显示数据库表中的第一个数据呢?

问题描述 其中combo1(项目)与adodc2相连,adodc中的属性中connectstring已连接数据库,datasource已连接adodc2.combo2(人员)与adodc3相连,adodc中的属性中connectstring已连接数据库,datasource已连接adodc3.但运行选择时只显示一行数据.这是为什么呢?是不是要添加个combo_click代码?代码是什么呢?求指教,谢谢. 解决方案 解决方案二:既然你绑定了又可以在运行时看到数据库的数据,那证明应该是没问题的不用写

数据显示优酷土豆月播放时长超越Youtube

9月20日,http://www.aliyun.com/zixun/aggregation/325.html">艾瑞针对优酷土豆合并的流量监测发布了进一步的数据,其中优酷土豆视频月播放时长超过16亿小时,VV(视频播放量)高达110亿次.照此数据,优酷土豆的观看时长已经超越全球视频行业老大Youtube在美国的时长. 详细数据显示,优酷土豆月播放时长超过16.79亿小时,相当于每月用户在优酷土豆观看的视频时长合计达到19万年.根据Comscore的统计数据,Youtube在美国7月份的播放

iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操作都提供了多套API.在今天的文章中将会对这些内容进行一一介绍: 音频 音效 音乐 音频会话 录音 音频队列服务 视频 MPMoviePlayerController MPMoviePlayerViewController AVPlayer 摄像头 UIImagePickerControlle

视频播放-android videoview 播放时视频图像偏离videoview的问题

问题描述 android videoview 播放时视频图像偏离videoview的问题 videoview被放到了ListView里(蛋疼),当videoview被滑出屏幕一部分时,也就是videoview只能看见一半,这时播放视频时,视频图像严重偏离videoview的窗口.也就是videoview里只看到一部分视频图像,其他部分全是黑的.请求大神帮助,谢谢.