You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何打开拆分后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:14:57