FFMpeg(Android)av_read_frame或avcodec_decode_video2返回相同的颜色

时间:2012-10-18 11:52:51

标签: android android-ndk ffmpeg rgb yuv

过去两周我一直在试验FFMpeg,我遇到了一些麻烦...... 首先,我一直在使用Galaxy S3,它工作得非常好,给了我最好的照片,但我最近换了一个Galaxy NEXUS给了我一堆问题......

我在做什么:我只是从视频中提取帧

我的表现如何:

while(av_read_frame(gFormatCtx, &packet)>=0)
        {
            // Is this a packet from the video stream?
            if(packet.stream_index==videoStream)
            {
                // Decode video frame
                avcodec_decode_video2(gVideoCodecCtx, pFrame, &frameFinished, &packet);
                // Did we get a video frame?
                if(frameFinished)
                {//and so on... But our problem is already here...

好的,现在pFrame正在保存我的帧的YUV表示...所以,为了检查我从avcodec_decode_video2(...)函数得到的内容我只是写{{1}到一个文件,所以我可以在网络上的任何YUV阅读器上看到它。

pFrame

好的,我现在将结果存储在我的Galaxy Nexus根存储器上的文件存储@ char yuvFileName[100]; sprintf(yuvFileName,"/storage/sdcard0/yuv%d.yuv",index); FILE* fp = fopen(yuvFileName, "wb"); int y; // Write pixel data for(y=0; y<gVideoCodecCtx->height; y++) { fwrite(pFrame->data[0]+y*pFrame->linesize[0], 1, gVideoCodecCtx->width, fp); } for(y=0; y<gVideoCodecCtx->height/2; y++) { fwrite(pFrame->data[1]+y*pFrame->linesize[1], 1, gVideoCodecCtx->width/2, fp); } for(y=0; y<gVideoCodecCtx->height/2; y++) { fwrite(pFrame->data[2]+y*pFrame->linesize[2], 1, gVideoCodecCtx->width/2, fp); } fclose(fp); 上。

但是如果我打开文件(例如XnView,这意味着正确显示YUV类型)我只在图片上看到深绿色。

困扰我的是Galaxy S3上的所有功能都正常,但GNexus上的功能失败......

所以这是我的问题:为什么它不适用于Galaxy Nexus?

Gnexus和armeabiv7之间的兼容性问题?

我不知道!

此致 Cehm

1 个答案:

答案 0 :(得分:2)

可能是你的帧没有很好地解码,因为decodec还没有得到关键帧。当我处理实时流时,这发生在我身上。所以在你保存生成的帧之前等待第一个关键帧。并使用pFrame-&gt;宽度而不是gVideoCodecCtx-&gt; width