
分类: 电脑/网络 >> *** 作系统/系统故障
问题描述:
怎么才可以使Windows Media播放器上面有字幕~ 求求GGJJ们谁能告诉我啊 `~
解析:
我的HDTV情况
1、硬件(办公室的电脑):CPU:P418G、内存:256M×2(自己加了一条)、显卡:ATi9200se
(自己加的)、声卡:SiXPack 51+(自己加的)。低端低端,见笑见笑!
2、软件:winxp sp2、wmp10、Moonlight-Elecard MPEG Player 30、Monkey's Audio、
SubtitleWorkshop251(改字幕格式为msi,否则wmp10不支持)。
3、软件注册使用:
(1)Moonlight-Elecard MPEG Player 30的注册方法:
①安装Moonlight-Elecard MPEG Player 30下载地址:
hdtvdownload/player/2005_04_14_0541421464148893
②打开注册机S&S,在其界面上的“name”一栏输入你想注册的英文名。
③按上、下顺序先后点击界面上的两处“generate”,得到三段注册字码。
④程序→Moonlight Cordless→Moonlight-Elecard MPEG Player 30→registrator,在出现的界面上点击“activate”(之前先点一下右框的“+”号,选取要注册的程序);在出现的界面上选“手动注册”(偶的英文不行,原文忘了)。
⑤将注册机S&S中“最下面的一大串”字码完整地复制到“registrator”界面的“最下面的”框内(原文忘了),再点击“下一步”。若出现“activation succeeded!You need restart activated product”则说明注册成功!我真不明白这么简单的事情,为什么被人说得那么复杂 (例如在线注册等等)。
(2)SubtitleWorkshop251的安装使用:
①安装SubtitleWorkshop251(选英文)。
②打开SubtitleWorkshop251,在“settings”中选取“language”中选取“CHINESE simplified”(我永远将我的国家大写!),界面全部变成中文!
③将界面中的“模式”设为“时间”、“导入每秒帧数”设为“25”、“使用”设为“两者”、“字体”设为“GB2312”。
④选取“文件→加载字幕”,找到你下载的srt、txt等格式的字幕。怎么样?字幕显示“行号”、“显示时间”、“隐藏时间”和中文字幕了吧?!
⑤在SubtitleWorkshop251选取“文件→另存为”,在出现的界面中双击“SAMI Captioning”就得到 i格式的字幕!!!要注意的是:字幕和影片的名称除扩展名外必须完全一样!!!
(3)Windows Media Player 10使用设置:打开wmp10:
①是否调用了Moonlight30的解码器?选取工具→选项→DVD→高级→看到月光了吗?
②字幕设置:选取工具→选项→安全:勾上“如果提供了本地语言的字幕,请显示他们”。然后选取播放→字幕:选中“开(如果可用)”。然后选取播放→字幕→默认设置(自己设吧!)
③播放设置(不设置也无所谓):选取工具→选项→性能→高级:勾上:
“视频加速”中的“使用视频混合呈现器”和“使用高质量模式”、
“DVD视频”中的“使用视频混合呈现器”和“启用全屏幕模式切换”、
其他设置按默认的不动。
4、播放:大家试试吧,保证流畅清晰!!!Windows Media Player10万岁!Moonlight万岁!!
5、抓屏问题:太方便了,点击“Ctrl + I”吧!如果抓不住想要的、最佳时间的画面,那就“暂停”后在抓!!抓下来的100-500K大小的比一般的数码相机拍的还好!!!
6、CPU占用率的问题:我不管这个问题!只要播放流畅清晰就好!!我以前在我的“烂机”上也试用过BSPlayer、KMPlayer、WinDVD60等,均不如wmp10流畅!其中BSPlayer的图像稍微、稍微、稍微清晰一些,但是不流畅又有什么用?!CPU占用率高又怎样?谁会一边看HDTV一边在电脑上干活?!只要播放流畅清晰就好!!!
屏幕的显示机制和帧动画类似,也是一帧一帧的连环画,只不过刷新频率很高,感觉像连续的。为了显示一帧,需要经历计算和渲染两个过程,CPU 先计算出这一帧的图像数据并写入内存,然后调用 OpenGL 命令将内存中数据渲染成图像存放在 GPU Buffer 中,显示设备每隔一定时间从 Buffer 中获取图像并显示。
上述过程中的计算,对于View来说,就好比在主线程遍历 View树 以决定视图画多大(measure),画在哪(layout),画些啥(draw),计算结果存放在内存中,SurfaceFlinger 会调用 OpenGL 命令将内存中的数据渲染成图像存放在 GPU Buffer 中。每隔166ms,显示器从 Buffer 中取出帧并显示。所以自定义 View 可以通过重载onMeasure()、onLayout()、onDraw()来定义帧内容,但不能定义帧刷新频率。
SurfaceView可以突破这个限制。而且它可以将计算帧数据放到独立的线程中进行。下面是自定义SurfaceView的模版代码:
public abstract class BaseSurfaceView extends SurfaceView implements SurfaceHolderCallback {
public static final int DEFAULT_FRAME_DURATION_MILLISECOND = 50;
//用于计算帧数据的线程
private HandlerThread handlerThread;
private Handler handler;
//帧刷新频率
private int frameDuration = DEFAULT_FRAME_DURATION_MILLISECOND;
//用于绘制帧的画布
private Canvas canvas;
private boolean isAlive;
public BaseSurfaceView(Context context) {
super(context);
init();
}
protected void init() {
getHolder()addCallback(this);
//设置透明背景,否则SurfaceView背景是黑的
setBackgroundTransparent();
}
private void setBackgroundTransparent() {
getHolder()setFormat(PixelFormatTRANSLUCENT);
setZOrderOnTop(true);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
isAlive = true;
startDrawThread();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
stopDrawThread();
isAlive = false;
}
//停止帧绘制线程
private void stopDrawThread() {
handlerThreadquit();
handler = null;
}
//启动帧绘制线程
private void startDrawThread() {
handlerThread = new HandlerThread(“SurfaceViewThread”);
handlerThreadstart();
handler = new Handler(handlerThreadgetLooper());
handlerpost(new DrawRunnable());
}
private class DrawRunnable implements Runnable {
@Override
public void run() {
if (!isAlive) {
return;
}
try {
//1获取画布
canvas = getHolder()lockCanvas();
//2绘制一帧
onFrameDraw(canvas);
} catch (Exception e) {
eprintStackTrace();
} finally {
//3将帧数据提交
getHolder()unlockCanvasAndPost(canvas);
//4一帧绘制结束
onFrameDrawFinish();
}
//不停的将自己推送到绘制线程的消息队列以实现帧刷新
handlerpostDelayed(this, frameDuration);
}
}
protected abstract void onFrameDrawFinish();
protected abstract void onFrameDraw(Canvas canvas);
}
用HandlerThread作为独立帧绘制线程,好处是可以通过与其绑定的Handler方便地实现“每隔一段时间刷新”,而且在Surface被销毁的时候可以方便的调用HandlerThreadquit()来结束线程执行的逻辑。
DrawRunnablerun()运用模版方法模式定义了绘制算法框架,其中帧绘制逻辑的具体实现被定义成两个抽象方法,推迟到子类中实现,因为绘制的东西是多样的,对于本文来说,绘制的就是一张张,所以新建BaseSurfaceView的子类FrameSurfaceView:
逐帧解析 & 及时回收
public class FrameSurfaceView extends BaseSurfaceView {
public static final int INVALID_BITMAP_INDEX = IntegerMAX_VALUE;
private List bitmaps = new ArrayList<>();
//帧
private Bitmap frameBitmap;
//帧索引
private int bitmapIndex = INVALID_BITMAP_INDEX;
private Paint paint = new Paint();
private BitmapFactoryOptions options = new BitmapFactoryOptions();
//帧原始大小
private Rect srcRect;
//帧目标大小
private Rect dstRect = new Rect();
private int defaultWidth;
private int defaultHeight;
public void setDuration(int duration) {
int frameDuration = duration / bitmapssize();
setFrameDuration(frameDuration);
}
public void setBitmaps(List bitmaps) {
if (bitmaps == null || bitmapssize() == 0) {
return;
}
thisbitmaps = bitmaps;
//默认情况下,计算第一帧的原始大小
getBitmapDimension(bitmapsget(0));
}
private void getBitmapDimension(Integer integer) {
final BitmapFactoryOptions options = new BitmapFactoryOptions();
optionsinJustDecodeBounds = true;
BitmapFactorydecodeResource(thisgetResources(), integer, options);
defaultWidth = optionsoutWidth;
defaultHeight = optionsoutHeight;
srcRect = new Rec
判断输出数据是否为关键帧的方法:booleankeyFrame=(bufferInfoflags&MediaCodecBUFFER_FLAG_KEY_FRAME)!=0;
在做视频录制时,发现使用MediaCodec做硬解码时,即使设置了MediaFormat的MediaFormatKEY_I_FRAME_INTERVAL属性也无法控制输出Buffer中关键帧的输出数量。后来发现原来是真正的原因是在于视频的输入源,如果是通过Camera的PreviewCallback的方式来获取视频数据再喂给MediaCodec的方式是无法控制输出关键帧的数量的。
想要控制输出输出关键帧数量就必须通过调用MediaCodeccreateInputSurface()方法获取输入Surface,再通过Opengl渲染后喂给MediaCodec才能真正控制关键帧的数量
VideoReader用法:
由命令help VideoReader,得
OBJ = VideoReader(FILENAME) constructs a multimedia reader object, OBJ, that can read in video data from a multimedia file
FILENAME is a string specifying the name of a multimedia file
There are no restrictions on file extensions
By default, MATLAB looks for the file FILENAME on the MATLAB path
该语句将视频文件读到OBJ结构,FILENAME为文件路径,可为绝对路径,默认路径为工程目录。
Matlab:视频读取和帧保存
VideoReader参数:
obj结构体:
obj = VideoReader('D://Media//111mp4');%输入视频位置
Name –视频文件名
Path – 视频文件路径
Duration – 视频的总时长(多少秒)
FrameRate –视频帧速(帧/秒)
NumberOfFrames – 视频的总帧数
Height – 视频帧的高度
Width – 视频帧的宽度
BitsPerPixel – 视频帧每个像素的数据长度(比特)
VideoFormat – 视频的类型, 如 ‘RGB24’
Tag – 视频对象的标识符,默认为空字符串”
Type – 视频对象的类名,默认为’VideoReader’
示例:
obj_numberofframe = objNumberOfFrame;%读取总的帧数
obj_height = objHeight;%读取视频帧高度
Matlab:视频读取和帧保存
read - 帧读取
frame = read(obj),%获取该视频对象的所有帧
frame = read(obj, index),%获取该视频对象的指定帧
frame = read(obj, 1); % first frame only 获取第一帧
frame = read(obj, [1 10]); % first 10 frames 获取前10帧
frame = read(obj, Inf); % last frame only 获取最后一帧
frame = read(obj, [50 Inf]); % frame 50 thru end 获取第50帧之后
Matlab:视频读取和帧保存
imwrite-帧保存
由命令help imwrite ,得
imwrite(A,FILENAME,FMT) writes the image A to the file specified by FILENAME in the format specified by FMT
示例:
imwrite(frame,strcat('D:\image\cankao1\1jpg'),'jpg');% 保存帧
%%%frame为待保存的某一帧
%%%strcat('D:\image\cankao1\1jpg')为保存目录
%%%'jpg'为保存格式
Matlab:视频读取和帧保存
视频读取和帧保存程序:
obj = VideoReader('outavi');%输入视频位置
numFrames = objNumberOfFrames;% 帧的总数
for k = 1 : 15% 读取前15帧
frame = read(obj,k);%读取第几帧
imshow(frame);%显示帧
imwrite(frame,strcat('im',num2str(k),'jpg'),'jpg');% 保存帧
end
Matlab:视频读取和帧保存
注意事项
有时在使用VideoReader读取视频时,matlab会报错:
matlab报错:
错误使用 VideoReader/init (line 619)
无法确定所需的编解码器。
出错 VideoReader (line 172)
objinit(fileName);
解决方法:下载完美转码者或格式工厂,将原视频进行转码,则报错消失。
Matlab:视频读取和帧保存
Matlab:视频读取和帧保存
这个是完全的服务器端技术,你需要在服务器端有解析视频文件的工具软件,通过上传文件后处理获取视频的某一帧以该视频文件相关的文件存储作为视频文件的提示。
一般视频网站上的处理流程是:
网络交互相关流程:
1接收上传视频文件
2检查接收文件是否是允许格式,是则进入后续步骤,否则进行提示
3存储视频文件,编写标准格式化名称(同时相关存储接收的描述文本)
4根据后续标准化处理过程要求分配任务,加入服务器段任务处理流程
5等待后台处理调度程序反馈处理结果进行相关显示
服务器后台相关流程
1执行后续处理任务[有必要就对视频文件转换成标准格式]提取视频中的一帧作为视频提示进行相关存储
2反馈处理结果给前台或者进行结果记录处理
如果楼主是本地处理,则除了网络交互相关流程中第一个流程不要外,其他流程也是必须的,只不过可能调度的过程是线性的,可以一个一个的处理,也就是把后台的2个过程插入网络交互的4和5之间。
相关工具可能你需要自己找一下,因为你的格式比较统一(wmv,你说的是wma,估计是你笔误啊),所以你只需要找windows media系列工具了,好像是有的,不过你最好找支持命令行调用的,这样才能批处理调用,减少人工干预。
以上就是关于可以通过视频编码获取视频吗全部的内容,包括:可以通过视频编码获取视频吗、怎样查看视频的最大分辨率和帧数、求Adobe Media Encoder的使用方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)