我使用 Python VLC 在 pyqt 中构建自定义播放应用程序。我画了一个漂亮的自定义滑块来跟踪视频,但遇到了一些恼人的问题。
无论我多久告诉我的滑块更新一次,它都会出现故障(每 1/4 秒左右跳跃一次)并且看起来不稳定(只是时间线,而不是视频)。
深入研究后我了解到
media_player.get_position()
Run Code Online (Sandbox Code Playgroud)
投票率相当低。它经常返回相同的值,然后在下次给出新值时跳跃很大。
所以现在我运行了一些测试指标,发现它往往每 0.25-0.3 秒更新一次。所以现在我有一个系统,它基本上存储最后一个值和最后一个新值进入的系统时间,以及返回值中的最后一个跳跃距离,并用这些东西做一些基本的数学运算,以伪造轮询之间正确的线性时间线数据,以生成非常流畅的时间线滑块。
问题是假设我每 0.25-0.3 秒的值在机器、硬件、视频帧速率等方面是一致的。
有谁知道更好的修复方法吗?
也许有一种方法可以提高 VLC 的轮询率,以便为我提供更好的数据 - 或者一些更好的数学来处理平滑?
谢谢
我想写一帧视频帧到*.yuv文件,发现这个教程的渲染视频到SDL表面.
现在我不确定如何在没有SDL库的情况下使用此代码.例如,锁定功能:
static void *lock(void *data, void **p_pixels)
{
struct ctx *ctx = data;
SDL_LockMutex(ctx->mutex);
SDL_LockSurface(ctx->surf);
*p_pixels = ctx->surf->pixels;
return NULL; /* picture identifier, not needed here */
}
Run Code Online (Sandbox Code Playgroud)
我怎么能写没有这个功能struct ctx,SDL_LockMutex和SDL_LockSurface?
你可以想象,我不是一个非常有经验的程序员,所以请耐心等待我;)
在此先感谢!
我正在尝试使用 libvlc 创建一个音频波可视化器。已彻底搜索网络,但无法找到任何帮助。如果有人能在这里帮助我,那就太好了。
提前致谢 :)
我正在尝试将 Mp4 文件流式传输到 webm 文件。
之后,我逐块读取该文件并将其提供给 HTML5 查看器(html 5 查看器的视频标签)
为了从 MP4 文件 webm 文件流式传输,我有三个选项
1) 使用 VLC 媒体播放器应用程序进行流式传输 2) 通过 C 代码使用 libVLC 进行流式 传输 如何使用 C/C++ 进行流式传输视频 3) 使用 ffmpeg 命令行进行流式传输 ffmpeg -i test.mp4 -c:v libvpx -c:a libvorbis -pix_fmt yuv420p -质量良好的输出.webm
使用由所有三个选项生成的 webm 时。第一个和第二个不起作用。当第三个正在工作时。第一个和第二个仅在流式传输到文件完成之后并且当输出文件的最后一个块被馈送到 html5 视频播放器时才起作用。
看来 vlcplayer 和 libVLC 没有使用 ffmpeg 生成的关键帧生成所需的片段。
无论如何,我们是否可以指示 libVLC 或 VLCplayer 也生成带有关键帧信息的片段?
我正在尝试使用 vlc 库在我的应用程序中重现视频。我一定错过了一些东西,因为如果我运行 vlc-android 应用程序它就可以工作。我认为这是由于文件位置造成的错误,但后来我使用日志系统从 vlc 应用程序中获取了位置字符串,但它无论如何都不起作用。很奇怪,在调用之前必须设置一些参数libvlc.playMRL(videoMedia.getMrl());
这是我的代码,它基本上初始化 LibVLC 并尝试从路径加载视频。
// Create a new media player
libvlc = new LibVLC();
libvlc.init(this);
libvlc.setHardwareAcceleration(LibVLC.HW_ACCELERATION_DISABLED);
libvlc.setSubtitlesEncoding("");
libvlc.setAout(LibVLC.AOUT_OPENSLES);
libvlc.setTimeStretching(true);
libvlc.setVerboseMode(true);
if(LibVlcUtil.isGingerbreadOrLater())
libvlc.setVout(LibVLC.VOUT_ANDROID_WINDOW);
else
libvlc.setVout(LibVLC.VOUT_ANDROID_SURFACE);
EventHandler.getInstance().addHandler(mHandler);
holder.setKeepScreenOn(true);
Media videoMedia = new Media(libvlc, "file:///storage/emulated/0/DCIM/Camera/20150513_005427.mp4");
libvlc.playMRL(videoMedia.getMrl());
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
核心输入:打开“file:///storage/emulated/0/DCIM/Camera/20150513_005427.mp4”失败 核心输入:无法打开您的输入 核心输入:VLC 无法打开 MRL '文件:/ //存储/模拟/0/DCIM/相机/20150513_005427.mp4'。检查日志以了解详细信息。
我正在尝试使用最后一个 LibVLC 为 Android 应用程序创建视频播放器。
问题是我不知道这个库是如何工作的,我找不到可以帮助我的示例(正如这里所说的https://bitbucket.org/edwardcw/libvlc-android-sample)
所以我尝试自己创建视频播放器:
public class VideoPlayerActivity extends AppCompatActivity implements IVideoPlayer, GestureDetector.OnDoubleTapListener, IDelayController {
private static LibVLC LibVLC() {
return VLCInstance.get();
}
private static MediaPlayer MediaPlayer() {
return VLCInstance.getMainMediaPlayer();
}
@Override
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Toast.makeText(getApplicationContext(), "Ca start VideoPlayerActivity !!", Toast.LENGTH_SHORT).show();
if (!VLCInstance.testCompatibleCPU(this)) {
// exit(RESULT_CANCELED);
return;
}
extras = getIntent().getExtras();
mUri = extras.getParcelable(PLAY_EXTRA_ITEM_LOCATION);
Toast.makeText(getApplicationContext(), "Oui ça start le VideoPlayer", Toast.LENGTH_SHORT).show();
setContentView(R.layout.player_test);
}
@Override
public void onResume() {
super.onResume();
mSurfaceView = (SurfaceView) …Run Code Online (Sandbox Code Playgroud) 经过 3 天的旅程,我终于编译了 libvlc-3.0.0-2.1.0.aar,用于将 VLC 播放器嵌入到我的 Android(电视)应用程序中。
\n\n改编LibVLC Android 示例后到我的项目中后,我终于运行了该应用程序。
\n\n问题:仅播放音频。视频永远不会出现(表面视图保持黑色)。我用不同的视频进行了测试,图像从未出现。
\n\n知道为什么视频没有播放吗?这是我尝试播放的视频示例(http://www.sample-videos.com/video/mp4/240/big_buck_bunny_240p_50mb.mp4)
\n\n我的设置:\n我已经刻录了Android 电视图像刻录到我的 RPI3 中,并且该应用程序正在其中运行。
\n\n更新:我已经尝试过 VLC 原始应用程序(来自 apk),并且发生了同样的情况。
\n\n这是我的活动的代码:
\n\npublic class MyVideoPlayerActivity extends Activity implements IVLCVout.Callback{\n\n public final static String TAG = "VideoActivity";\n\n // display surface\n private SurfaceView mSurface;\n private SurfaceHolder holder;\n\n // media player\n private LibVLC libvlc;\n private MediaPlayer mMediaPlayer = null;\n private int mVideoWidth;\n private int mVideoHeight;\n private final static int VideoSizeChanged = …Run Code Online (Sandbox Code Playgroud) 有mpv播放器,它是旧 MPlayer 的一个分支。它可以构建为库,并具有 API 将视频帧渲染到许多视频输出,例如 OpenGL 表面、Direct3D、SDL 等。我正在尝试在我当前的项目中使用这个库来解码来自云的 flv 流。
但我找不到一种方法将解码的视频帧直接渲染到用户空间分配的内存缓冲区。由于特定原因,我需要此选项,并且上面列出的接口不适合我的任务。我还需要一个回调,该回调将在每帧解码并写入内存后调用。
有没有办法使用libmpv/client.h中的标准 mpv API 来实现此功能?如果不是,如何编写简单的视频输出驱动程序并将指向自定义内存的指针传递给它?
我已经使用 libVLC 来完成我的任务,它有清晰的界面来根据我的需要设置一些回调,但不幸的是 libVLC 2.x 包含错误,在从云播放视频流期间出现灰色帧伪影。
最初,该依赖项包含在 Android 9 的 Android.mk 文件中。该模块可以编译并运行,不会出现任何构建错误。
迁移到 Android 11 时,必须将依赖项“libvlc”添加到 Android.bp static_libs 中。
android_app {
compile_multilib: "both",
static_libs: [
" libvlc",
...
],
}
cc_prebuilt_library_shared {
name: "libvlc",
srcs: ["libs/libvlc.so"],
vendor: true,
}
Run Code Online (Sandbox Code Playgroud)
这会引发错误:
dependency "libvlc" of "MyModule" missing variant:
os:android, arch:common
available variants:
os:android, image:vendor.30, arch:arm64_armv8-a_cortex-a53, sdk:, link:shared, version:
os:android, image:vendor.30, arch:arm64_armv8-a_cortex-a53, sdk:, link:static, version:
os:android, image:vendor.30, arch:arm_armv7-a-neon_cortex-a9, sdk:, link:shared, version:
os:android, image:vendor.30, arch:arm_armv7-a-neon_cortex-a9, sdk:, link:static, version:
14:54:21 soong bootstrap failed with: exit status 1
#### failed to build …Run Code Online (Sandbox Code Playgroud)