小编tis*_*shu的帖子

尝试在FFMPEG C项目中使用openH264替代libX264

我有一个应用程序使用FFMPEG和x264编码器逐帧转码视频.我希望发布这个应用程序,但x264的许可使我转而使用openh264.

我设法顺利编译所有内容(openh264然后FFMPEG与enable-openh264).我现在正在尝试纠正我的C代码中的编码器设置,因为对libx264起作用的东西不再起作用了.不幸的是我发现FFMPEG/openh264的C/C++示例非常有限,我将不胜感激任何链接/提示.

我使用以下代码(dec_ctx是我正在解码的视频的AVCodecContext)

            enc_ctx->height = dec_ctx->height;
            enc_ctx->width = dec_ctx->width;
            enc_ctx->sample_aspect_ratio = dec_ctx->sample_aspect_ratio;
            /* take first format from list of supported formats */
            enc_ctx->pix_fmt = encoder->pix_fmts[0];
            /* video time_base can be set to whatever is handy and supported by encoder */
            enc_ctx->time_base = dec_ctx->time_base;

            enc_ctx->gop_size      = 120; /* emit one intra frame every twelve frames at most */
            enc_ctx->max_b_frames = 16;
            enc_ctx->scenechange_threshold = 0;
            enc_ctx->rc_buffer_size = 0;
            enc_ctx->me_method = ME_ZERO;

            enc_ctx->ticks_per_frame = dec_ctx->ticks_per_frame * ifmt_ctx->streams[i]->time_base.den * ifmt_ctx->streams[i]->r_frame_rate.num/ifmt_ctx->streams[i]->r_frame_rate.den;
            // Set Ultrafast profile. …
Run Code Online (Sandbox Code Playgroud)

c ffmpeg video-encoding openh264

10
推荐指数
1
解决办法
2294
查看次数

libavcodec 获取视频时长和帧率

我有一个编码的视频.3gp h.264,我希望在 C 中获得它的帧率和持续时间。这是我在打开文件并找到合适的编解码器后使用的代码:

AVRational rational = gVideoCodecCtx->time_base;

LOGI(10, "numerator is %i", rational.num);
LOGI(10, "denominator is %i", rational.den);
LOGI(10, "duration is %d", gFormatCtx->duration);
LOGI(10, "fps is %d", (double)av_q2d(rational));
Run Code Online (Sandbox Code Playgroud)

这是输出:

12-02 12:30:19.819: I/FFmpegTest(23903): numerator is 1
12-02 12:30:19.819: I/FFmpegTest(23903): denominator is 180000
12-02 12:30:19.819: I/FFmpegTest(23903): duration is 6594490
12-02 12:30:19.819: I/FFmpegTest(23903): fps is 1692926992
Run Code Online (Sandbox Code Playgroud)

从文档中我了解到持续时间是“duration/time_base”,它给了我6594490 / 180000 = 36.6. 我的视频文件的持续时间是6 seconds,我不知道这个因素6来自哪里。

此外,帧率似乎完全关闭。

目前很难找到帮助,因为很多教程使用不推荐使用的方法,并且文档没有给出示例。

任何帮助,将不胜感激。

谢谢

编辑: 感谢下面的评论,我设法打印了以下内容

12-02 18:59:36.279: I/FFmpegTest(435): numerator is 1 …
Run Code Online (Sandbox Code Playgroud)

video duration ffmpeg frame-rate libavcodec

5
推荐指数
1
解决办法
6704
查看次数

Android TextureView和硬件加速

我正在尝试实现此页面上显示的示例.我试过运行android 4及更高版本的三个不同的设备,并且在所有情况下我得到一个带有此警告的黑屏:

01-27 20:01:22.683: W/TextureView(4728): A TextureView or a subclass can only be used with hardware acceleration enabled.
Run Code Online (Sandbox Code Playgroud)

我在应用程序清单中打开了硬件加速:

<application
    android:hardwareAccelerated="true"
    [etc...]
Run Code Online (Sandbox Code Playgroud)

但是下面检查我的自定义视图的onAttachedToWindow方法总是返回false

private class MyTextureView extends TextureView
{
    public MyTextureView(Context context) {
        super(context);
    }

    @Override
    protected void onAttachedToWindow()
    {
        super.onAttachedToWindow();
        Log.d("", Boolean.toString(mTextureView.isHardwareAccelerated()));          
    }
}
Run Code Online (Sandbox Code Playgroud)

有人知道这里有什么问题吗?

谢谢

android hardware-acceleration

5
推荐指数
1
解决办法
4153
查看次数

跟踪提交给ThreadPoolExecutor的任务

我正在ThreadPoolExecutor中运行多个任务。我将其初始化如下:

private VideoExportExecutor executor;
private BlockingQueue<Runnable> jobQueue;

public void initialiseVideoProcessor()
{
    jobQueue = new LinkedBlockingQueue<Runnable>();
    executor = new VideoExportExecutor(1, 1, Long.MAX_VALUE, TimeUnit.SECONDS, jobQueue);
}
Run Code Online (Sandbox Code Playgroud)

我已经实现了runnable(VideoExportThread)的实现,其中包含一种getProgress()跟踪提交任务进度的方法。我提交如下实例:

executor.submit(new VideoExportThread(gcmPath));
Run Code Online (Sandbox Code Playgroud)

我正在查询一种查询executor / blockingQueue的当前/待处理线程的方法。我试图使用jobQueue.toArray()和重写exe​​cutor方法,beforeExecute(Thread t, Runnable r)但是在两种情况下,返回的runnable都是FutureTask类型,它不包含太多数据。我是否可以使用它来检索我的原始VideoExportThread实例,以识别正在运行的实例并查询其进度?

谢谢

java multithreading executor futuretask

5
推荐指数
1
解决办法
1579
查看次数

使用 Java 中的本机代码进行 Proguard

我有一个罐子,我想缩小和混淆它。它引用自定义 JNI 库。我的 proguard conf 文件中有这个:

# Keep names - Native method names. Keep all native class/method names.
-keepclasseswithmembers,includedescriptorclasses class * {
    native <methods>;
}
Run Code Online (Sandbox Code Playgroud)

但仍然在运行时我得到:

Exception in thread "Thread-2" java.lang.NoSuchMethodError: error
    at com.test.model.Video.naInit(Native Method)
    at com.test.model.Video.a(Video.java:95)
    at com.test.ui.ExportWindow$8.run(ExportWindow.java:561)
Run Code Online (Sandbox Code Playgroud)

这是 Video.java 中调用的第一个 JNI 方法

private native int naInit(String inFileName, String outFileName);
Run Code Online (Sandbox Code Playgroud)

我认为上面的混淆线应该保留所有本机名称?有人可以告诉我我做错了什么吗?

java java-native-interface proguard

5
推荐指数
0
解决办法
838
查看次数

打开预览时,摄像机视图上的Android SurfaceView覆盖不会显示

我有一个包含两个SurfaceViews的FrameLayout.其中一个将显示相机预览,另一个是我用于绘图的自定义表面视图.问题是表面视图没有显示出来.如果我注释掉相机开始预览的行,它会在黑色背景上显示.这表明我的Surface视图定位良好,但我怀疑当相机预览绘制时出现问题.

相机视图:

public CameraView(Context context, AttributeSet a) {
    super(context, a);
    mHolder = getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
Run Code Online (Sandbox Code Playgroud)

自定义视图:

public InclinaisonGauge(Context context, AttributeSet attrs) {
    super(context, attrs);
    getHolder().addCallback(this);
    getHolder().setFormat(PixelFormat.TRANSLUCENT);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    run = true;
    updateThread = new Thread()
    {
        public void run()
        {
            Canvas c = null;
            final SurfaceHolder inclHolder = getHolder();
            while (run) {
                try {
                    c = inclHolder.lockCanvas();
                    if(c!=null)
                    {
                        synchronized (inclHolder) {
                            onDraw(c);
                        }
                    }
                } finally {
                // do this in a finally …
Run Code Online (Sandbox Code Playgroud)

java camera android overlay surfaceview

2
推荐指数
1
解决办法
5660
查看次数

android共享库中.so.12文件的不满意链接

我正在为 Android 构建 libexif。我正在使用以下交叉编译脚本:

PLATFORM_PREFIX=/home/tishu/Documents/osx-wks/GC/Thdl/jni/libexif-0.6.21/arch-arm/
NDK_PATH=/home/tishu/Documents/android-ndk-r8e/
NDK_PLATFORM=android-14

rmdir $PLATFORM_PREFIX
mkdir $PLATFORM_PREFIX

$NDK_PATH/build/tools/make-standalone-toolchain.sh  --system=linux-x86_64 --platform=$NDK_PLATFORM --install-dir=$PLATFORM_PREFIX

PATH=$PLATFORM_PREFIX/bin:$PATH

./configure --host=arm-linux-androideabi --prefix=$PLATFORM_PREFIX --enable-static
make clean
make install
Run Code Online (Sandbox Code Playgroud)

输出在 lib 文件夹中提供了 3 个 .so 文件

  • libexif.so(符号链接)
  • libexif.so.12(看起来像一个符号链接,但内容是大二进制)
  • libexif.so.12.3.3(实际二进制)

我已将最后一个文件重命名为 libexif.so 并根据本网站上的一些建议删除了两个符号链接。然后我想用我的应用程序构建它并使用以下 Android.mk,其中 libexif_native 是我使用 libexif 库的 c 文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libexif
LOCAL_SRC_FILES := libexif-0.6.21/arch-arm/lib/libexif.so
LOCAL_EXPORT_C_INCLUDES := libexif-0.6.21/arch-arm/include
LOCAL_EXPORT_LDLIBS := libexif-0.6.21/arch-arm/lib/libexif.so
LOCAL_PRELINK_MODULE := true
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_ALLOW_UNDEFINED_SYMBOLS=false
LOCAL_MODULE := libexif_native
LOCAL_SRC_FILES := libexif_native1.1.4.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/libexif-0.6.21/arch-arm/include
LOCAL_C_INCLUDES …
Run Code Online (Sandbox Code Playgroud)

linker static-libraries android-ndk

2
推荐指数
1
解决办法
1942
查看次数