0

过去两周我一直在试验 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(...)函数中得到的内容,我只是写入pFrame一个文件,这样我就可以使用网络上的任何 YUV 阅读器查看它。

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);

好的,现在我的结果在/storage/sdcard0/blabla.YUV我的 Galaxy Nexus 根内存上的文件存储 @ 上。

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

令我困扰的是,Galaxy S3 上一切正常,但 GNexus 上出现故障......

所以这是我的问题:为什么它在 Galaxy Nexus 上不起作用?

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

我不知道 !

问候, 切姆

4

1 回答 1

2

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

于 2012-12-05T08:25:25.453 回答