MATLAB封装子系统后如何解封装?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB封装子系统后如何解封装?相关的知识,希望对你有一定的参考价值。
1.设置编译器:在确定安装好Matlab Compiler后,还需要对Compiler进行适当的配置,方法是在Matlab命令窗口输入:
Mbuild –setup, 按提示选择matlab自带编译器LCC。
2.将脚本编译为可执行文件:
如项目文件包含:gui.m, gui.gif, fun1.m。
在此路径下命令行输入:mcc –m gui.m,生 成:mccExcludedFiles.log,ReadMe.txt,gui.ctf,gui.prj,gui_main.c,gui_mcc_component_data.c,gui.exe。其中:gui.ctf,gui.exe为脱离matlab环境运行必需的文件。
3.在未安装matlab的机器上运行可执行程序。
将R22007b\toolbox\compiler\deploy\win32中的MCRinstaller.exe安装到该计算机上,将生成可执行程序脱离matlab运行所需的函数库。
将2中生成的gui.ctf,gui.exe拷贝到该计算机同一路径。运行gui.exe将生成gui_mcr文件夹,包含程序运行所需的库。至此完成。
4.去除独立可执行程序运行时的“DOS黑窗口”。
以上生成的exe程序运行时首先弹出一个DOS界面窗口,如果不需要其输出数据和错误信息,可将其去除。
matlba命令行输入:
cd(prefdir)
edit compopts.bat
此时compopts.bat打开,在文件最后添加:
set LINKFLAGS=%LINKFLAGS% -subsystem windows
如果程序比较复杂,易出现异常,则不建议去除这个dos窗口以便调试。
另外,这个办法是适用于你用的编译器为LCC,如果是其他的,那么所加语句有所不同
Microsoft Visual C/C++:
set LINKFLAGS=%LINKFLAGS% /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup
Borland:
set LINKFLAGS=%LINKFLAGS% -aa 参考技术A 右键子系统,选择Subsystem & Model Reference 里面Expand Subsystem,就可以取消子系统,然后把框删掉就行了
或者快捷键Ctrl+Shift+g 参考技术B 鼠标右键,上面有个look under mask选项。追问
右击子系统还是空白处?
追答右击子系统。如果不知道,你尝试一下就知道了。。。
追问为什么是灰色的呢。。。不能截屏,只能拍照了~~谢谢你~
解决了没有?
本回答被提问者采纳FFMPEG 视频图像解封装解码
FFMPEG4.0 音频解码解封装FFMPEG 音频封装编码
下面的函数方法基于最新的FFMPEG 4.0(4.X):
本文讲是如何从一个视频文件中提取出其中的图像数据,并将图像数据保存到文件中。
解码解封装的过程与音频差不多,具体如下:
1.读取视频文件的格式信息
fmt_ctx = avformat_alloc_context();
avformat_open_input(&fmt_ctx,input,NULL,NULL);
avformat_find_stream_info(fmt_ctx,NULL);
2.获取视频流
int st_index = av_find_best_stream(fmt_ctx,AVMEDIA_TYPE_VIDEO,-1,-1,NULL,0);
LOGV("st_index = %d\n",st_index);
AVStream *st = fmt_ctx->streams[st_index];
3.准备×××与解码context
AVCodec *codec = avcodec_find_decoder(st->codecpar->codec_id);
AVCodecContext *codec_ctx = avcodec_alloc_context3(codec);
4.拷贝视频流中的参数到×××context中并打开×××
avcodec_parameters_to_context(codec_ctx,st->codecpar);
avcodec_open2(codec_ctx,codec,NULL);
5.读取视频的格式、宽高信息
int width = codec_ctx->width;
int height = codec_ctx->height;
enum AVPixelFormat pixel_fmt = codec_ctx->pix_fmt;
6.申请图像存储空间
uint8_t *dst_buf[4] = {0};
int dst_linesize[4];
int size = av_image_alloc(dst_buf,dst_linesize,width,height,pixel_fmt,1);
7.申明存储原始数据与解码后数据的packet与frame
AVFrame *frame = av_frame_alloc();
AVPacket *packet = av_packet_alloc();
8.读取数据,只取用视频数据
int ret = av_read_frame(fmt_ctx,packet);
//读取到的packet不仅仅是图像数据,还有音频、字幕等数据。
if(packet->stream_index != st_index)
{
continue;
}
9.发送数据进行解码ret = avcodec_send_packet(codec_ctx,packet);
10.接收解码后的原始数据,这是个反复的过程,一个packet可能解码出好几个frame
ret = avcodec_receive_frame(codec_ctx,frame);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) //packet解码完了,需要sent
break;
if(ret < 0) {
return 1;
}
注意:收到的frame可能存在宽高或者fmt格式变化这种情况,后面的流程代码没有考虑这种情况(这种奇葩视频应该不会遇到)
if(frame->width != width || frame->height != height || frame->format != pixel_fmt)
{
LOGV("eeeeeeeeeeeee");
}
11.把frame中的数据拷贝到事先准备的dst_buf中。二维指针数组看作一位数组。av_image_copy(dst_buf,dst_linesize,frame->data,frame->linesize,pixel_fmt,width,height);
12.把数据写入文件。fwrite(dst_buf[0],1,size,out_file);
下面贴一段完整的示例代码,代码没有考虑失败的情况,结尾没有搞释放,也没有flush×××,示例只是为了掌握整个核心解码流程。
/*
* demuxing_decode_video.c
*
* Created on: 2019年1月8日
* Author: deanliu
*/
#include <libavutil/imgutils.h>
#include <libavutil/samplefmt.h>
#include <libavutil/timestamp.h>
#include <libavformat/avformat.h>
static char log_buf[1024*8];
#define LOGV(...) av_log(NULL,AV_LOG_VERBOSE,__VA_ARGS__)
void ffmpeg_log_callback(void* ptr, int level, const char* fmt, va_list vl)
{
static int print_prefix = 1;
av_log_format_line(ptr,level,fmt,vl,log_buf,sizeof(log_buf),&print_prefix);
fprintf(stderr,"%s",log_buf);
}
int main()
{
av_log_set_callback(ffmpeg_log_callback);
char *input = "E:/测试音视频/12种格式视频/test.avi";
char *output = "d:/video.v";
FILE *out_file = fopen(output,"wb");
AVFormatContext *fmt_ctx;
fmt_ctx = avformat_alloc_context();
avformat_open_input(&fmt_ctx,input,NULL,NULL);
avformat_find_stream_info(fmt_ctx,NULL);
int st_index = av_find_best_stream(fmt_ctx,AVMEDIA_TYPE_VIDEO,-1,-1,NULL,0);
LOGV("st_index = %d\n",st_index);
AVStream *st = fmt_ctx->streams[st_index];
AVCodec *codec = avcodec_find_decoder(st->codecpar->codec_id);
AVCodecContext *codec_ctx = avcodec_alloc_context3(codec);
avcodec_parameters_to_context(codec_ctx,st->codecpar);
avcodec_open2(codec_ctx,codec,NULL);
int width = codec_ctx->width;
int height = codec_ctx->height;
enum AVPixelFormat pixel_fmt = codec_ctx->pix_fmt;
uint8_t *dst_buf[4] = {0};
int dst_linesize[4];
int size = av_image_alloc(dst_buf,dst_linesize,width,height,pixel_fmt,1);
AVFrame *frame = av_frame_alloc();
AVPacket *packet = av_packet_alloc();
while(1)
{
LOGV("READ\n");
int ret = av_read_frame(fmt_ctx,packet);
if(ret < 0){
LOGV("ret = %d\n",ret);
break;
}
if(packet->stream_index != st_index)
{
continue;
}
LOGV("SENT\n");
ret = avcodec_send_packet(codec_ctx,packet);
if(ret < 0){
return 1;
}
while(ret >= 0)
{
LOGV("receiver\n");
ret = avcodec_receive_frame(codec_ctx,frame);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
break;
if(ret < 0) {
return 1;
}
if(frame->width != width || frame->height != height || frame->format != pixel_fmt)
{
LOGV("eeeeeeeeeeeee");
}
av_image_copy(dst_buf,dst_linesize,frame->data,frame->linesize,pixel_fmt,width,height);
LOGV("dst_buf = %d,%d,%d,%d\n",dst_buf[2][0],dst_buf[1][1],dst_buf[0][2],dst_buf[0][3]);
fwrite(dst_buf[0],1,size,out_file);
}
}
LOGV("dst_linesize = %d,%d,%d,%d\n",dst_linesize[0],dst_linesize[1],dst_linesize[2],size);
printf("Play the output video file with the command:\n"
"ffplay -f rawvideo -pix_fmt %s -video_size %dx%d %s\n",
av_get_pix_fmt_name(pixel_fmt), width, height,
output);
LOGV("END!!");
fclose(out_file);
return 0;
}
以上是关于MATLAB封装子系统后如何解封装?的主要内容,如果未能解决你的问题,请参考以下文章