从ffmpeg中取出YUV数据
来源:互联网 发布:炉石数据库 编辑:程序博客网 时间:2024/05/17 03:40
有时需要从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数据参照这个函数就能获得
...
}
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数据参照这个函数就能获得
...
}
- 从ffmpeg中取出YUV数据
- ffmpeg从AVFrame取出yuv数据到保存到char*中
- 从JDBC中取出数据
- 从数据库中取出数据
- ffmpeg中获取yuv解码后数据
- 从Jason格式数据中,取出数据。
- qtp测试从datatable中取出数据
- ffmpeg 中AVFrame YUV
- FFmpeg 中 YUV
- 用ffmpeg抽取yuv数据
- PHP 从数据库中取出数据并存为Json数据
- PHP 从数据库中取出数据并存为Json数据
- 不用mfc的方法,从dc中取出图象数据
- MySQL 如何从表中取出随机数据
- MySQL 如何从表中取出随机数据
- 从数据库中取出数据,并生成xml文档
- 从数据库中取出数据导入到xml中的方法
- 从数据库中随机的取出n条数据
- Python笔记
- Oracle常用命令
- Eclipse下提示Errors occurred during the build.的处理方法
- explain plan for 执行计划中各字段各模块描述
- ubuntu安装goldendict翻译工具,很好用!
- 从ffmpeg中取出YUV数据
- 分享到其他网站的js代码
- 关于RakNet的一些入门的入门的总结
- win7任务栏上的资源管理器默认指向库的修改为计算机
- Linux的文件系统
- WEB前端网站优化
- Delphi GDI+ 图形处理(3)
- myeclipse报错“java.lang.NoSuchFieldError: INSTANCE” 以及 myeclipse项目名上有感叹号
- Linux磁盘