如何打开拆分后的YUV420分量文件?附拆分代码及播放疑问
如何用ffplay播放拆分后的YUV420 Y分量文件
嘿,我来帮你搞定这个问题~你遇到的核心问题是:拆分后的output_420_y.y只是单通道的灰度亮度数据,并不是完整的YUV420p格式,所以直接用播放完整YUV的命令会解析出错。你需要明确告诉ffplay把它当成8位灰度原始视频来处理,具体命令如下:
ffplay -f rawvideo -pixel_format gray8 -video_size 640x360 -i output_420_y.y
参数详解:
-f rawvideo:告知ffplay输入是未压缩的原始裸数据,没有封装格式-pixel_format gray8:指定像素格式为8位灰度(YUV420的Y分量每个像素正好占1字节,完全匹配这个格式)-video_size 640x360:必须和原YUV文件的分辨率保持一致,这里用你例子中的640x360即可-i output_420_y.y:指定要播放的Y分量文件路径
额外验证小技巧(可选):
如果你想确认拆分的分量是否正确,可以用ffmpeg把三个分量合并回完整的YUV420p文件,再用原命令播放验证:
ffmpeg -f rawvideo -pixel_format gray8 -video_size 640x360 -i output_420_y.y -f rawvideo -pixel_format gray8 -video_size 320x180 -i output_420_u.y -f rawvideo -pixel_format gray8 -video_size 320x180 -i output_420_v.y -filter_complex "mergeplanes=0:1:2:yuv420p" merged.yuv
之后用你原来的命令播放merged.yuv,如果和原YUV文件画面一致,说明拆分逻辑是完全正确的。
你的拆分代码(供参考):
int simplest_yuv420_split(char *url, int w, int h,int num){ FILE *fp=fopen(url,"rb+"); FILE *fp1=fopen("output_420_y.y","wb+"); FILE *fp2=fopen("output_420_u.y","wb+"); FILE *fp3=fopen("output_420_v.y","wb+"); unsigned char *pic=(unsigned char *)malloc(w*h*3/2); for(int i=0;i<num;i++){ fread(pic,1,w*h*3/2,fp); //Y fwrite(pic,1,w*h,fp1); //U fwrite(pic+w*h,1,w*h/4,fp2); //V fwrite(pic+w*h*5/4,1,w*h/4,fp3); } free(pic); fclose(fp); fclose(fp1); fclose(fp2); fclose(fp3); return 0; }
内容的提问来源于stack exchange,提问作者Sprunki Online
相关产品推荐
相关产品推荐

