Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

新增ffmpeg核心 #307

Merged
merged 46 commits into from
Feb 23, 2022
Merged

新增ffmpeg核心 #307

merged 46 commits into from
Feb 23, 2022

Conversation

lifegpc
Copy link
Contributor

@lifegpc lifegpc commented Feb 1, 2022

为MusicPlayer2增加一个调用ffmpeg解码和使用SDL2渲染的核心。

TODOS

  • 支持常用的标签
  • 支持音量调节(使用volume filter)
  • 支持变速(使用atempo filter)
  • 支持选择音频设备
  • 支持频谱分析
  • 支持均衡器
  • 支持混响
  • 支持自定义支持格式(目前随便输了几个常见格式)

@zhongyang219
Copy link
Owner

我感觉目前IPlayerCore接口设计得不够好,我以后打算让获取音频标签的功能全部由TagLib来实现,而不是由选择的播放内核实现,因此我建议你不用去研究如何通过ffmpeg获取各种音频文件的标签信息了。

@lifegpc
Copy link
Contributor Author

lifegpc commented Feb 2, 2022

我主要是为了引入缓冲区以及变速不会变调(使用atempo不会导致声调变化

@lifegpc
Copy link
Contributor Author

lifegpc commented Feb 2, 2022

我目前引入了一个15s的缓冲区,打算再写个设置暴露给GUI,让用户可以指定缓冲区长度/大小 ( #288

@lifegpc
Copy link
Contributor Author

lifegpc commented Feb 4, 2022

image
尝试写了个频谱分析,效果看上去跟BASS完全不一样

@lifegpc
Copy link
Contributor Author

lifegpc commented Feb 20, 2022

预编译
64bit
64bit pdb
32bit
32bit pdb

@lifegpc
Copy link
Contributor Author

lifegpc commented Feb 22, 2022

image
测试的时候,发现打开cue的除了第一个轨道外的轨道就会向核心传递cue文件的位置(ffmpeg并不支持cue所以报错

@lifegpc
Copy link
Contributor Author

lifegpc commented Feb 22, 2022

image 测试的时候,发现打开cue的除了第一个轨道外的轨道就会向核心传递cue文件的位置(ffmpeg并不支持cue所以报错

把最新的commit merge后解决了(

@lifegpc
Copy link
Contributor Author

lifegpc commented Feb 22, 2022

但是我发现,切换歌曲时向核心多次发送了open指令,参数一模一样
是ape文件Seek时的问题,正在寻找解决方案

@zhongyang219
Copy link
Owner

image 测试的时候,发现打开cue的除了第一个轨道外的轨道就会向核心传递cue文件的位置(ffmpeg并不支持cue所以报错

MusicPlayer2本身是支持cue的,而且和播放内核无关,如果播放列表中包含cue文件,在加载播放列表时会自动将cue文件展开成每个音轨,并将cue文件本身从播放列表中移除。因此MusicPlayer2不需要内核支持cue,只需要cue关联的音频文件能被内核支持即可播放。只要在InitCore函数中将cue添加到支持的格式列表里,即使是MCI内核也能播放cue。

@lifegpc
Copy link
Contributor Author

lifegpc commented Feb 22, 2022

看来是ape文件seek后,第一个包解出来的pts可能是未设置导致一些不可控的BUG
Edited:
image
上面是发生错误时的输出,下面是正常时的

@zhongyang219
Copy link
Owner

@lifegpc ffmpeg-core的编译说明可以写详细一点吗,折腾了半天也没搞懂那个pkg-config是怎么用的

@lifegpc
Copy link
Contributor Author

lifegpc commented Feb 22, 2022

@lifegpc ffmpeg-core的编译说明可以写详细一点吗,折腾了半天也没搞懂那个pkg-config是怎么用的

pkg-config 是这样的
就是编译FFMPEG的时候,会生成一些.pc文件,里面存了关于ffmpeg这些库的配置信息(安装目录在哪,库在哪,头文件在哪,依赖库有哪些)
然后使用的时候先把环境变量PKG_CONFIG_PATH设置到libavcodec.pc这些文件的所在的目录
假设ffmpeg的安装目录是E:\ffmpeg
那么应该这样(以cmd为例)

set PKG_CONFIG_PATH=E:/ffmpeg/lib/pkgconfig
cmake -A x64 -DCMAKE_PREFIX_PATH=E:/ffmpeg -DCMAKE_INSTALL_PREFIX=E:/ffmpeg CMakeLists.txt所在目录

-A x64 说明让CMake生成x64的VS项目文件(在Windows上,CMake优先使用VS)

@zhongyang219
Copy link
Owner

ffmpeg我是用vs编译的,只有lib和dll文件,要怎么才能生成.pc文件呢

@lifegpc
Copy link
Contributor Author

lifegpc commented Feb 22, 2022

ffmpeg我是用vs编译的,只有lib和dll文件,要怎么才能生成.pc文件呢

你可以自己写,其实MingW shell可以用MSVC编译的(这样就有.pc文件了

@lifegpc
Copy link
Contributor Author

lifegpc commented Feb 22, 2022

https://trac.ffmpeg.org/wiki/CompilationGuide/MSVC
这里有指南
PS.
直接在vs的Command Prompt内启动mingw64/mingw32就可以自动设置MSVC的环境变量(记得把mingw64/mingw32.ini里加上 MSYS2_PATH_TYPE=inherit

@lifegpc
Copy link
Contributor Author

lifegpc commented Feb 22, 2022

附上我编译时留的笔记

export "LIB=$LIB;E:\shared\MusicPlayer2\lib"
export "INCLUDE=$INCLUDE;E:\shared\MusicPlayer2\include"
export PKG_CONFIG_PATH=/e/shared/MusicPlayer2/lib/pkgconfig
export CFLAGS=-MD
./configure --enable-gpl --enable-shared --disable-static --enable-version3 --prefix=/e/shared/MusicPlayer2 --toolchain=msvc --disable-doc --pkg-config-flags="--env-only" --disable-autodetect --disable-encoders --disable-filters "--enable-filter=volume,atempo,equalizer,aresample" --disable-muxers --enable-bzlib --enable-gnutls --enable-libcdio --enable-zlib

@zhongyang219
Copy link
Owner

还有个问题,我注意到core.h中包含了两个头文件:

#include "c_linked_list.h"
#include "urlparse.h"

这几个文件你是不忘了提交?

@lifegpc
Copy link
Contributor Author

lifegpc commented Feb 22, 2022

还有个问题,我注意到core.h中包含了两个头文件:

#include "c_linked_list.h"
#include "urlparse.h"

这几个文件你是不忘了提交?

是一个子仓库
跑一下 git submodule update --init 就好

@zhongyang219
Copy link
Owner

还有个问题,我注意到core.h中包含了两个头文件:

#include "c_linked_list.h"
#include "urlparse.h"

这几个文件你是不忘了提交?

是一个子仓库 跑一下 git submodule update --init 就好

好的,明白了

@lifegpc
Copy link
Contributor Author

lifegpc commented Feb 22, 2022

现在还有个小问题,得引入精确定位,不然播放cue文件开头一部分播放不到

@zhongyang219
Copy link
Owner

@lifegpc 我建议ffmpeg-core这部分代码还是建一个新的仓库单独存放吧,这个pr就只提交MusicPlayer2部分的代码,一方面是这部分代码对于MusicPlayer2来说是一个独立的模块,另一方面这部分代码可能基本上还是由你来维护,以后提交代码会更方便些。

@lifegpc
Copy link
Contributor Author

lifegpc commented Feb 23, 2022

@lifegpc 我建议ffmpeg-core这部分代码还是建一个新的仓库单独存放吧,这个pr就只提交MusicPlayer2部分的代码,一方面是这部分代码对于MusicPlayer2来说是一个独立的模块,另一方面这部分代码可能基本上还是由你来维护,以后提交代码会更方便些。

好的,分离好了,
核心仓库 https://github.com/lifegpc/ffmpeg_core

@zhongyang219 zhongyang219 merged commit 58d7689 into zhongyang219:master Feb 23, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants