亲自体验:
测试命令:x264 --crf 22 -o test.mp4 hall_cif.yuv 352x288
操作系统:xp
版本:
x264.exe:$Id: x264.c,v 1.1 2004/06/03 19:24:12 fenrir Exp $
libx264.lib:不会看,是x264-060805-vc6工程里的
后缀 | 是否支持 | 备注 |
.mp3 | 支持,用ffplay播放正常 | |
.mp4 | 不支持,x264 [error]: not compiled with MP4 output support | |
.mp5 | open_file_bsf(...)被调用 | |
.mp6 | 支持,用ffplay播放正常 | open_file_bsf(...)被调用 |
.mkv | 支持,用ffplay播放正常,用暴风影音播放正常 | open_file_mkv(...)被调用 |
.avi | 支持,用ffplay播放正常 | open_file_bsf(...)被调用 |
.txt | 支持,用ffplay播放正常 | open_file_bsf(...)被调用 |
.doc | 支持,用ffplay播放正常 | open_file_bsf(...)被调用 |
.rmv | 支持,用ffplay播放正常 | open_file_bsf(...)被调用 |
.rmvb | 支持,用ffplay播放正常 | open_file_bsf(...)被调用 |
.rar | ||
.china | ||
.cn | ||
.中国 | 支持,用ffplay播放正常 | open_file_bsf(...)被调用 |
.com | 支持,用ffplay播放正常 | open_file_bsf(...)被调用 |
.1 | 支持,用ffplay播放正常 | open_file_bsf(...)被调用 |
.exe | 支持,用ffplay播放正常 | open_file_bsf(...)被调用 |
.264 | 支持,用ffplay播放正常 | open_file_bsf(...)被调用 |
.avc | 支持,用ffplay播放正常 | open_file_bsf(...)被调用 |
可以看出,除了特殊的mp4外,其它已知的后缀和未知的后缀,编码都被作为一种来处理了。两种处理生成的文件是不一样的。如下:
test.mkv 683 KB (699,747 字节)
test.1、test.txt等,679 KB (695,328 字节)
生成的不同后缀的名字,图标受操作系统的规则显示,但是都可以用ffplay播放,包括中文的后缀名。
实际播放截图
这些后缀是旧瓶装新酒,如果直接双击按默认打开是不正确的
直接打开test.txt就是错的,要用ffplay test.txt才行
以上是用最笨的办法来测试的,实际本质上,当然是源程序里的区别对待,下面尝试在源码中找到答案:
->main(...)
->Parse(...)
{
//这儿提前赋值了,不另外单独识别的,都用此处理
p_open_outfile = open_file_bsf; /*函数指针赋值*/
p_set_outfile_param = set_param_bsf; /*函数指针赋值*/
p_write_nalu = write_nalu_bsf; /*函数指针赋值*/
p_set_eop = set_eop_bsf; /*函数指针赋值*/
p_close_outfile = close_file_bsf; /*函数指针赋值*/
p_set_outfile_param = set_param_bsf; /*函数指针赋值*/
p_write_nalu = write_nalu_bsf; /*函数指针赋值*/
p_set_eop = set_eop_bsf; /*函数指针赋值*/
p_close_outfile = close_file_bsf; /*函数指针赋值*/
//mp4和mkv两种输出格式,单独进行了处理
//mp4文件
if( !strncasecmp(optarg + strlen(optarg) - 4, ".mp4", 4) ) /* strncasecmp:比较字符串s1和s2的前n个字符但不区分大小写 */
{
#ifdef MP4_OUTPUT
p_open_outfile = open_file_mp4;//muxers.c
p_write_nalu = write_nalu_mp4;
p_set_outfile_param = set_param_mp4;
p_set_eop = set_eop_mp4;
p_close_outfile = close_file_mp4;
printf("\n (x264.c\case 'o')");//zjh
#else
fprintf( stderr, "x264 [error]: not compiled with MP4 output support\n" );
return -1;
#endif
}
if( !strncasecmp(optarg + strlen(optarg) - 4, ".mp4", 4) ) /* strncasecmp:比较字符串s1和s2的前n个字符但不区分大小写 */
{
#ifdef MP4_OUTPUT
p_open_outfile = open_file_mp4;//muxers.c
p_write_nalu = write_nalu_mp4;
p_set_outfile_param = set_param_mp4;
p_set_eop = set_eop_mp4;
p_close_outfile = close_file_mp4;
printf("\n (x264.c\case 'o')");//zjh
#else
fprintf( stderr, "x264 [error]: not compiled with MP4 output support\n" );
return -1;
#endif
}
}
//MKV文件
else if( !strncasecmp(optarg + strlen(optarg) - 4, ".mkv", 4)
else if( !strncasecmp(optarg + strlen(optarg) - 4, ".mkv", 4)
{
p_open_outfile = open_file_mkv;//muxers.c
p_write_nalu = write_nalu_mkv;
p_set_outfile_param = set_param_mkv;
p_set_eop = set_eop_mkv;
p_close_outfile = close_file_mkv;
}
p_open_outfile = open_file_mkv;//muxers.c
p_write_nalu = write_nalu_mkv;
p_set_outfile_param = set_param_mkv;
p_set_eop = set_eop_mkv;
p_close_outfile = close_file_mkv;
}