过去两周我一直在试验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
答案 0 :(得分:2)
可能是你的帧没有很好地解码,因为decodec还没有得到关键帧。当我处理实时流时,这发生在我身上。所以在你保存生成的帧之前等待第一个关键帧。并使用pFrame-&gt;宽度而不是gVideoCodecCtx-&gt; width