我想在Android中解码并显示原始的h264视频字节流,因此我目前正在使用这些MediaCodec/Format类.我从服务器通过Udp获取帧数据.但是,遗憾的是,目前没有显示任何内容.
这是我到目前为止所拥有的.
初始化MediaCodec类:
codec = MediaCodec.createDecoderByType("video/avc");
MediaFormat format = new MediaFormat();
format.setString(MediaFormat.KEY_MIME, "video/avc");
format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 100000);
format.setInteger(MediaFormat.KEY_WIDTH, 800);
format.setInteger(MediaFormat.KEY_HEIGHT, 600);
format.setInteger("max-width", 800);
format.setInteger("max-height", 600);
format.setInteger("push-blank-buffers-on-shutdown", 1);
codec.configure(format, surface, null, 0);
Run Code Online (Sandbox Code Playgroud)
解码器的用法:
int inIndex = codec.dequeueInputBuffer(10000);
if(inIndex >= 0)
{
ByteBuffer inputBuffer = codecInputBuffers[inIndex];
inputBuffer.clear();
inputBuffer.put(frameData);
codec.queueInputBuffer(inIndex, 0, frameSize, 33, 0);
}
int outIndex = codec.dequeueOutputBuffer(null, 10000);
switch(outIndex)
{
case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
codecOutputBuffers = codec.getOutputBuffers();
System.out.println("OB Changed");
break;
case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
System.out.println("OF Changed");
break;
case MediaCodec.INFO_TRY_AGAIN_LATER:
System.out.println("l8r");
break;
default:
ByteBuffer buffer = …Run Code Online (Sandbox Code Playgroud) 如果有关于矩阵乘法的问题.存储在View Projection Matrix第四行的信息是什么?我认为旋转和缩放信息存储在上面的3x3矩阵中,然后在第四列中进行转换,最后一个元素设置为1.我很难,因为我得到了我的VP矩阵的以下结果:
当不应用旋转且不进行平移时(注意所有值都被舍入):
0.34 0 0 0
0 0.61 0 0
0 0 -1 -0.2
0 0 -1 0
Run Code Online (Sandbox Code Playgroud)
应用-100的翻译:
0.34 0 0 0
0 0.61 0 -61.73
0 0 -1 -0.2
0 0 -1 0
Run Code Online (Sandbox Code Playgroud)
平移-100,然后在正X轴上旋转30°,然后在正Y轴上旋转180°:
-0.34 0 -3 0
0 0.53 0.3 -53.46
0 -0.5 0.86 49.8
0 -0.5 0.8 50
Run Code Online (Sandbox Code Playgroud)
它看起来不对我.有趣的部分:它有效.那么这条线的信息是什么?
0 -0.5 0.8 50
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
再次是关于Android MediaCodec类的问题。我已经成功地解码了原始的h264内容,并在两个TextureViews中显示了结果。h264流来自运行openGL场景的服务器。该场景具有摄像头,因此可响应用户输入。为了进一步减少服务器上的输入和智能手机上的实际结果之间的延迟,我正在考虑使用MediaCodecs异步模式。这是我设置同步和异步两个变量的方式:
异步:
//decoderCodec is "video/avc"
MediaFormat fmt = MediaFormat.createVideoFormat(decoderCodec, 1280,720);
codec.setCallback(new MediaCodec.Callback() {
@Override
public void onInputBufferAvailable(MediaCodec codec, int index) {
byte[] frameData;
try {
frameData = frameQueue.take(); //this call is blocking
} catch (InterruptedException e) {
return;
}
ByteBuffer inputData = codec.getInputBuffer(index);
inputData.clear();
inputData.put(frameData);
codec.queueInputBuffer(index, 0, frameData.length, 0, 0);
}
@Override
public void onOutputBufferAvailable(MediaCodec codec, int index, MediaCodec.BufferInfo info) {
codec.releaseOutputBuffer(index, true);
}
//The two other methods are left blank at the moment.
});
codec.configure(fmt, surface, null, 0); …Run Code Online (Sandbox Code Playgroud) 我想新的花式C#本地函数我可以摆脱强制私有递归函数.显然,这个功能"应该"做一些树的后期顺序.因此,只给予IFF元素没有可用的左或右子.
代码编译,它"工作",但是对本地函数的递归调用:
PostOrderRecursive(currentNode.Left);并且PostOrderRecursive(currentNode.Right);在调试时被忽略.所以根本不执行递归.
这里有什么问题?提前致谢!
public IEnumerable<ElementType> GetSubtreeFlattenedPostOrder()
{
return PostOrderRecursive(this);
IEnumerable<ElementType> PostOrderRecursive(BinaryTree<ElementType> currentNode)
{
if (currentNode.HasLeft)
PostOrderRecursive(currentNode.Left);
if (currentNode.HasRight)
PostOrderRecursive(currentNode.Right);
yield return currentNode.element;
}
}
Run Code Online (Sandbox Code Playgroud)