我有一个应用程序使用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) 我有一个编码的视频.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) 我正在尝试实现此页面上显示的示例.我试过运行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)
有人知道这里有什么问题吗?
谢谢
我正在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()
和重写executor方法,beforeExecute(Thread t, Runnable r)
但是在两种情况下,返回的runnable都是FutureTask类型,它不包含太多数据。我是否可以使用它来检索我的原始VideoExportThread
实例,以识别正在运行的实例并查询其进度?
谢谢
我有一个罐子,我想缩小和混淆它。它引用自定义 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)
我认为上面的混淆线应该保留所有本机名称?有人可以告诉我我做错了什么吗?
我有一个包含两个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) 我正在为 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 并根据本网站上的一些建议删除了两个符号链接。然后我想用我的应用程序构建它并使用以下 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) java ×3
android ×2
ffmpeg ×2
android-ndk ×1
c ×1
camera ×1
duration ×1
executor ×1
frame-rate ×1
futuretask ×1
libavcodec ×1
linker ×1
openh264 ×1
overlay ×1
proguard ×1
surfaceview ×1
video ×1