昨天我发现了一些结构初始化代码,它让我循环.这是一个例子:
typedef struct { int first; int second; } TEST_STRUCT;
void testFunc() {
TEST_STRUCT test = {
second: 2,
first: 1
};
printf("test.first=%d test.second=%d\n", test.first, test.second);
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是(对我来说),这是输出:
-> testFunc
test.first=1 test.second=2
Run Code Online (Sandbox Code Playgroud)
如您所见,struct正确初始化.我不知道标签语句可以这样使用.我已经看到了其他几种进行结构初始化的方法,但我没有在任何在线C FAQ上找到任何这种结构初始化的例子.有人知道这是如何/为什么有效?
对我来说,这些术语在使用C编程语言时基本上是同义词.在实践中,我可能更喜欢文件内原型的"前向声明"而不是通过头文件包含的原型的"函数原型".但是当你考虑预处理后发生的事情时,即使这是一个人为的区别.也许我错过了一些东西.
关于何时使用一个术语而不是另一个术语是否存在共识?
理想情况下,我想完成两个目标:
Camera预览将预览数据传递给MediaCodec编码器Surface.我可以创建Surface使用MediaCodec.createInputSurface()但是Camera.setPreviewDisplay()需要a SurfaceHolder,而不是a Surface. Camera预览数据传递给编码器之外,我还想在屏幕上显示预览(这样用户实际上可以看到他们编码的内容).如果编码器没有参与,那么我会使用a SurfaceView,但这似乎不适用于这种情况,因为SurfaceView创建了自己的编码器Surface,我认为我需要使用创建的编码器MediaCodec.我在网上搜索了很多解决方案,但没有找到解决方案.bigflake.com上的一些例子似乎是朝着正确方向迈出的一步,但他们采取了一种方法,增加了一堆我想避免的EGL/SurfaceTexture开销.我希望有一个简单的例子或解决方案,我能得到Camera并且MediaCodec不涉及EGL或纹理更直接交谈.
我Camera使用MediaCodecmime-type"video/avc" 编码预览数据,并将编码数据(仅限视频,无音频)传递给MediaMuxer.复用器似乎运行正常并创建一个合理大小的输出文件(即,我记录的时间越长,越大).但是,当我尝试停止复用器时,我得到"无法停止复用器"错误:
10-21 10:39:40.755: E/AndroidRuntime(2166): Caused by: java.lang.IllegalStateException: Failed to stop the muxer
Run Code Online (Sandbox Code Playgroud)
在失败的停止之前有一些可疑的MPEG4Writer日志消息:
10-21 10:39:40.740: D/MPEG4Writer(2166): Stopping Video track
10-21 10:39:40.740: E/MPEG4Writer(2166): Missing codec specific data
10-21 10:39:40.740: W/MPEG4Writer(2166): 0-duration samples found: 122
10-21 10:39:40.740: I/MPEG4Writer(2166): Received total/0-length (123/1) buffers and encoded 123 frames. - video
10-21 10:39:40.740: D/MPEG4Writer(2166): Stopping Video track source
10-21 10:39:40.740: D/MPEG4Writer(2166): Video track stopped
10-21 10:39:40.740: D/MPEG4Writer(2166): Stopping writer thread
10-21 10:39:40.740: D/MPEG4Writer(2166): 0 chunks are written in …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来确定ARM处理器是从冷启动(即初始上电)到热启动(即没有实际功率损耗的复位断言)启动.具体来说,我正在使用ARM968内核,将使用C或汇编进行确定,我将使用该确定,因此某些操作仅在初始上电时运行,而不是在后续复位时运行.在之前的项目中,我利用外部电路(例如FPGA)来检测不同的启动方案,但在这种情况下,我仅限于ARM内核.
我正在寻找从MediaCodec解码器接收图像帧并将其绘制到Android设备屏幕的最快方法.重要的限制和解释是:
无法使用MediaPlayer.不允许使用中间应用.
必须尽快将MediaCodec解码器的输出帧绘制到屏幕上(最小化延迟).
可用的解码器输出格式如下:
ColorFormat [0] 0x00000013 COLOR_FormatYUV420Planar
ColorFormat [1] 0x00000015 COLOR_FormatYUV420SemiPlanar
ColorFormat [2] 0x7F000001 OMX_SEC_COLOR_FormatNV12TPhysicalAddress
ColorFormat [3] 0x7FC00002 OMX_SEC_COLOR_FormatNV12Tiled
视频分辨率以及每个输出帧的分辨率为960x720.
目标平台是Galaxy Note II,该方法可以特定于该平台(例如,利用可用的硬件功能).这不需要在其他平台上工作或者是通用解决方案.
一种不到66毫秒的方法会很好.不到33毫秒会很棒.我目前的方法需要80-90毫秒,这很糟糕.(我不打算去描述它,因为我不想在任何特定的方向上扭曲答案.)
我有一个应用程序来获取带有曲面的相机预览帧.它适用于Android 4.0.4,但在更新后它不适用于同一设备上的Jelly Bean,4.1.2.简单地说,回调永远不会被回调.这是代码:剪了一下:
public class Panel extends Activity {
Camera myCamera;
int cameraId = -1;
MyCameraSurfaceView myCameraSurfaceView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_panel);
myCamera = getCameraInstance();
myCamera.setPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
Log.d("Camera Preview", data.length + "");
}
});
myCameraSurfaceView = new MyCameraSurfaceView(this, myCamera);
FrameLayout myCameraPreview = (FrameLayout) findViewById(R.id.videoview);
myCameraPreview.addView(myCameraSurfaceView);
}
private Camera getCameraInstance() {
Camera c = null;
try {
c = Camera.open();
} catch (Exception e) {
e.printStackTrace();
}
return c; …Run Code Online (Sandbox Code Playgroud) (请耐心等待,我认为是用 C 而不是 Python,所以你可能会看到一些真正愚蠢的东西......)
我有许多(100+)不同的 C structs,作为 拉入 Python(版本 3.5.1)bytes,我希望能够使用原始 C 结构体的变量名来访问它们。这是一个简单的例子。在Python中我收到了这些bytes:
# In Python:
example1_bytes = b'\x08\x09\x0a\x0b'
Run Code Online (Sandbox Code Playgroud)
假设这些bytes是由运行 C 的程序提供的,使用struct以下格式:
// In C:
struct example1 {
uint8_t val1;
uint8_t val2;
uint8_t val3;
uint8_t val4; };
Run Code Online (Sandbox Code Playgroud)
我该如何处理example1_bytes才能像这样访问它们:
# In Python:
result = process_example1_bytes(example1_bytes)
print(result.val1)
# Prints "8"
print(result.val2)
# Prints "9"
# Et cetera
Run Code Online (Sandbox Code Playgroud)
更进一步,如果 Cstruct更复杂并且包含数组和/或子结构怎么办?例如,这样的事情:
// In C:
struct substruct {
uint8_t ss_val1;
uint8_t ss_val2; }; …Run Code Online (Sandbox Code Playgroud) 我在developer.android.com上看到了对Wi-Fi Direct演示应用程序的引用,但我不知道如何定位和/或导入它.大多数Android教程都是直截了当的,我可以下载并添加项目作为现有代码(例如网络服务发现),但我对Wi-Fi Direct没有任何好运.
这不一定是股票Wi-Fi Direct演示(假设存在一个).我只想要一些我可以进入ADT的东西,所以我有一些示例源代码.(我知道我链接的Wi-Fi Direct页面上有代码片段,但我正在寻找一个已知功能项目,而不是片段.)
作为参考,我正在运行Android Developer Tools Build:v21.1.0-569685,我有两部运行Android版本4.2.x的手机.
android ×5
c ×3
mediacodec ×3
camera ×2
surfaceview ×2
adt ×1
android-wifi ×1
arm ×1
boot ×1
callback ×1
decoder ×1
embedded ×1
encoder ×1
frame ×1
label ×1
mp4 ×1
muxer ×1
python ×1
python-3.x ×1
reset ×1
struct ×1
terminology ×1
video ×1
wifi-direct ×1
yuv ×1