有时需要从ffmpeg中提取出YUV数据用作预览,另存什么的。
ffmpeg是先解码成YUV, 再以这个YUV作为输入进行编码, 所以YUV数据有两种: 解码后的YUV数据, 以及 编码重建的YUV数据。 下面分别讲两个YUV数据从哪儿?以及如何取? 1. 解码后的YUV数据 在ffmpeg/libavcodec/utils_codec.c的 avcodec_decode_video2() 函数中: avcodec_decode_video2(...) { ... ret = avctx->codec->decode(avctx, picture, got_picture_ptr,avpkt); /* 插入如下代码代码 */ // picture.data 就包含了解码后的YUV数据 { int i, j; int shift; char *yuv = NULL; FILE *fp = fopen("dec_output.yuv", "ab+"); // 一定要用'b'打开,不然会数据错位 for (i = 0; i < 3; i++) { shift = i>0 ? 1 : 0; yuv = picture.data[i]; for (j = 0; j < picture.height>>shift; j++) { fwrite(yuv, sizeof(char), picture.width>>shift, fp); // 每次写一行YUV帧数据 yuv += picture.linesize[i]; // ffmpeg将解码数据进行了扩边,需要以扩边为步长,找下行数据。 } } fflush(fp); fclose(fp); } /* 插入代码结束 */ picture->pkt_dts= avpkt->dts; ... } 2. x264编码重建后的YUV数据 现在视频编码格式通常是H.264, x264已有重建YUV写成文件的接口,所以可以直接使用。 对应的参数为: ffmpeg -i INPUT ... -vcodec libx264 -x264opts dump-yuv=recon.yuv -f flv -y OUTPUT 输出文件在: x264/encoder/encoder.c的 x264_encoder_frame_end()函数中: x264_encoder_frame_end() { ... if( h->param.psz_dump_yuv ) x264_frame_dump( h ); //YUV数据参照这个函数就能获得 ... }
转自:http://blog.chinaunix.net/uid-26000296-id-3570272.html