本帖最后由 slimay 于 2021-8-19 19:18 编辑
bmp3 命令行 万能播放器
bmp系列第三方的简介
第一代 bmp.exe 由 大佬plp626 发现的 cmd 窗口显示图片, 由此开启了批处理 图形游戏的黄金时代, 堪称 批处理界的第一次科技 革 命.由此衍生的image系列第三方,培养了一大堆批处理图形游戏开发高手,他们至今依就活跃在bat吧和各大批处理论坛 . 参考下载: http://www.bathome.net/thread-11364-1-1.html
第二代 bmp2.exe 我进行了些许改进, 实现批量播放图片, 也就是逐帧动画. 参考帖子9楼下载: http://www.bathome.net/thread-59519-1-1.html
第三代 bmp3.exe 主要不想费脑, 直接借用ffmpeg库, 套个壳, 批处理 直接 播放视频, 懒得写声音了,方便自己使用其他第三方配音. 参考下载: http://cmd1152.ys168.com/ 网盘目录下的 文件区 \ bmp3命令行万能播放( 最新 ).zip
下载加强版 ,请直接下载 网盘目录下的 文件区 bmp3(加强版).zip, 加强版支持缩放参数(第五个参数),支持暂停p键,支持快进d, 兼容xp系统, 经测试, 无显卡的xp系统,依然能8%的cpu占用率流畅运行,毫无卡的. 如果有独立显卡, 可能会造成不兼容性.
流畅的一塌糊涂,可以自行添加延时时长.- 用法: bmp3 视频文件路径 延时时间秒可以0.几秒 在窗口显示的横坐标位置 在窗口显示的纵坐标位置
复制代码 (延时, 坐标也可省略不写,默认 0)
bmp3核心源码, 就是用GDI把每一帧BMP 画出来, 送佛送到西, 再也不用转图片了- static int show_frame(Graphics& graph, int xPos, int yPos, AVCodecContext *avctx, struct SwsContext *img_convert_ctx, AVFrame *frame, int *frame_count, AVPacket *pkt, int last )
- {
- int len, got_frame;
- len = avcodec_decode_video2( avctx, frame, &got_frame, pkt );
- if( len < 0 )
- {
- fprintf( stderr, "Error while decoding frame %d\n", *frame_count );
- return len;
- }
-
- if( got_frame )
- {
- int numBytes = avpicture_get_size( AV_PIX_FMT_BGR24, frame->width, frame->height );
- uint8_t* buffer = ( uint8_t * )av_malloc( numBytes * sizeof( uint8_t ) );
-
- AVFrame *pFrameRGB = av_frame_alloc();
- avpicture_fill( ( AVPicture * )pFrameRGB, buffer, AV_PIX_FMT_BGR24, frame->width, frame->height );
- sws_scale( img_convert_ctx, frame->data, frame->linesize, 0, frame->height, pFrameRGB->data, pFrameRGB->linesize );
-
- Bitmap bitmap(frame->width, frame->height, frame->width *3, PixelFormat24bppRGB, pFrameRGB->data[0]);
- graph.DrawImage(&bitmap, xPos, yPos);
-
- av_freep( &pFrameRGB[0] );
- av_free( pFrameRGB );
-
- ( *frame_count )++;
- }
-
- if( pkt->data )
- {
- pkt->size -= len;
- pkt->data += len;
- }
- return 0;
- }
复制代码
|