QtAVPlayer: Error compiling for Android on MacOS, Qt 6.4.3
Fresh download, unchanged, compiling for arm64-v8a, then error at linking. I assume because the android ffmpeg libraries are not OK. Which is a question which possibly could get avoided if QtAVPlayer could get configured to use the ffmpeg provided with Qt 6.4.3 and later. See #276
The environment:
export AVPLAYER_ANDROID_LIB_ARMEABI_V8A=/Users/myname/Projects/QtAVPlayer.android/ffmpeg/arm64-v8a/lib
export AVPLAYER_ANDROID_LIB_X86=/Users/myname/Projects/QtAVPlayer.android/ffmpeg/x86/lib
export AVPLAYER_ANDROID_LIB_X86_64=/Users/myname/Projects/QtAVPlayer.android/ffmpeg/x86_64/lib
export CPLUS_INCLUDE_PATH=/Users/myname/Projects/QtAVPlayer.android/ffmpeg/arm64-v8a/include:$CPLUS_INCLUDE_PATH
export ANDROID_NDK_ROOT=/Users/myname/Development/android-sdk-macosx/ndk/23.1.7779620
qmake:
~/Qt/6.4.3/android_arm64_v8a/bin/qmake
compiling (with make -j8) goes through without error, until linking:
/Users/myname/Development/android-sdk-macosx/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -target aarch64-linux-android23 -fno-limit-debug-info -Wl,--no-undefined -Wl,--build-id=sha1 -Wl,--no-undefined -Wl,-z,noexecstack -shared -Wl,-soname,libQt6AVPlayer_arm64-v8a.so -o libQt6AVPlayer_arm64-v8a.so .obj/qavaudiooutput.o .obj/qavplayer.o .obj/qavcodec.o .obj/qavframecodec.o .obj/qavaudiocodec.o .obj/qavvideocodec.o .obj/qavsubtitlecodec.o .obj/qavdemuxer.o .obj/qavpacket.o .obj/qavframe.o .obj/qavstreamframe.o .obj/qavvideoframe.o .obj/qavaudioframe.o .obj/qavsubtitleframe.o .obj/qavvideobuffer_cpu.o .obj/qavvideobuffer_gpu.o .obj/qavfilter.o .obj/qavvideofilter.o .obj/qavaudiofilter.o .obj/qavfiltergraph.o .obj/qavinoutfilter.o .obj/qavvideoinputfilter.o .obj/qavaudioinputfilter.o .obj/qavvideooutputfilter.o .obj/qavaudiooutputfilter.o .obj/qaviodevice.o .obj/qavstream.o .obj/qavfilters.o .obj/qavhwdevice_mediacodec.o .obj/moc_qavplayer.o -L/Users/myname/Projects/QtAVPlayer.android/ffmpeg/arm64-v8a/lib -lavcodec -lavformat -lswscale -lavutil -lswresample /Users/myname/Qt/6.4.3/android_arm64_v8a/lib/libQt6Multimedia_arm64-v8a.so /Users/myname/Qt/6.4.3/android_arm64_v8a/lib/libQt6Gui_arm64-v8a.so -lEGL /Users/myname/Qt/6.4.3/android_arm64_v8a/lib/libQt6Network_arm64-v8a.so /Users/myname/Qt/6.4.3/android_arm64_v8a/lib/libQt6Concurrent_arm64-v8a.so /Users/myname/Qt/6.4.3/android_arm64_v8a/lib/libQt6Core_arm64-v8a.so -llog -pthread -lGLESv2 /Users/myname/Qt/6.4.3/android_arm64_v8a/lib/libQt6Gui_arm64-v8a.so -lEGL /Users/myname/Qt/6.4.3/android_arm64_v8a/lib/libQt6Core_arm64-v8a.so -llog -pthread -lGLESv2 -llog -lz -lm -ldl -lc
ld: error: undefined symbol: avdevice_register_all
>>> referenced by qavdemuxer.cpp:110
>>> .obj/qavdemuxer.o:(QAVDemuxer::QAVDemuxer(QObject*))
ld: error: undefined symbol: av_buffersrc_add_frame_flags
>>> referenced by qavvideofilter.cpp:68
>>> .obj/qavvideofilter.o:(QAVVideoFilter::write(QAVFrame const&))
>>> referenced by qavaudiofilter.cpp:61
>>> .obj/qavaudiofilter.o:(QAVAudioFilter::write(QAVFrame const&))
ld: error: undefined symbol: av_buffersink_get_frame_flags
>>> referenced by qavvideofilter.cpp:94
>>> .obj/qavvideofilter.o:(QAVVideoFilter::read(QAVFrame&))
>>> referenced by qavaudiofilter.cpp:86
>>> .obj/qavaudiofilter.o:(QAVAudioFilter::read(QAVFrame&))
ld: error: undefined symbol: av_buffersink_get_frame_rate
>>> referenced by qavvideofilter.cpp:100
>>> .obj/qavvideofilter.o:(QAVVideoFilter::read(QAVFrame&))
ld: error: undefined symbol: av_buffersink_get_time_base
>>> referenced by qavvideofilter.cpp:101
>>> .obj/qavvideofilter.o:(QAVVideoFilter::read(QAVFrame&))
>>> referenced by qavaudiofilter.cpp:92
>>> .obj/qavaudiofilter.o:(QAVAudioFilter::read(QAVFrame&))
ld: error: undefined symbol: av_buffersrc_add_frame
>>> referenced by qavvideofilter.cpp:127
>>> .obj/qavvideofilter.o:(QAVVideoFilter::flush())
>>> referenced by qavaudiofilter.cpp:118
>>> .obj/qavaudiofilter.o:(QAVAudioFilter::flush())
ld: error: undefined symbol: avfilter_graph_free
>>> referenced by qavfiltergraph.cpp:51
>>> .obj/qavfiltergraph.o:(QAVFilterGraph::~QAVFilterGraph())
>>> referenced by qavfiltergraph.cpp:51
>>> .obj/qavfiltergraph.o:(QAVFilterGraph::~QAVFilterGraph())
>>> referenced by qavfiltergraph.cpp:60
>>> .obj/qavfiltergraph.o:(QAVFilterGraph::parse(QString const&))
ld: error: undefined symbol: avfilter_inout_free
>>> referenced by qavfiltergraph.cpp:52
>>> .obj/qavfiltergraph.o:(QAVFilterGraph::~QAVFilterGraph())
>>> referenced by qavfiltergraph.cpp:53
>>> .obj/qavfiltergraph.o:(QAVFilterGraph::~QAVFilterGraph())
>>> referenced by qavfiltergraph.cpp:52
>>> .obj/qavfiltergraph.o:(QAVFilterGraph::~QAVFilterGraph())
>>> referenced 3 more times
ld: error: undefined symbol: avfilter_graph_alloc
>>> referenced by qavfiltergraph.cpp:63
>>> .obj/qavfiltergraph.o:(QAVFilterGraph::parse(QString const&))
ld: error: undefined symbol: avfilter_graph_parse2
>>> referenced by qavfiltergraph.cpp:64
>>> .obj/qavfiltergraph.o:(QAVFilterGraph::parse(QString const&))
ld: error: undefined symbol: avfilter_pad_get_type
>>> referenced by qavfiltergraph.cpp:91
>>> .obj/qavfiltergraph.o:(QAVFilterGraph::apply(QAVFrame const&))
>>> referenced by qavfiltergraph.cpp:116
>>> .obj/qavfiltergraph.o:(QAVFilterGraph::apply(QAVFrame const&))
ld: error: undefined symbol: avfilter_graph_config
>>> referenced by qavfiltergraph.cpp:146
>>> .obj/qavfiltergraph.o:(QAVFilterGraph::config())
ld: error: undefined symbol: avfilter_get_by_name
>>> referenced by qavvideoinputfilter.cpp:97
>>> .obj/qavvideoinputfilter.o:(QAVVideoInputFilter::configure(AVFilterGraph*, AVFilterInOut*))
>>> referenced by qavaudioinputfilter.cpp:96
>>> .obj/qavaudioinputfilter.o:(QAVAudioInputFilter::configure(AVFilterGraph*, AVFilterInOut*))
>>> referenced by qavvideooutputfilter.cpp:34
>>> .obj/qavvideooutputfilter.o:(QAVVideoOutputFilter::configure(AVFilterGraph*, AVFilterInOut*))
>>> referenced 1 more times
ld: error: undefined symbol: avfilter_graph_create_filter
>>> referenced by qavvideoinputfilter.cpp:96
>>> .obj/qavvideoinputfilter.o:(QAVVideoInputFilter::configure(AVFilterGraph*, AVFilterInOut*))
>>> referenced by qavaudioinputfilter.cpp:95
>>> .obj/qavaudioinputfilter.o:(QAVAudioInputFilter::configure(AVFilterGraph*, AVFilterInOut*))
>>> referenced by qavvideooutputfilter.cpp:33
>>> .obj/qavvideooutputfilter.o:(QAVVideoOutputFilter::configure(AVFilterGraph*, AVFilterInOut*))
>>> referenced 1 more times
ld: error: undefined symbol: avfilter_link
>>> referenced by qavvideoinputfilter.cpp:102
>>> .obj/qavvideoinputfilter.o:(QAVVideoInputFilter::configure(AVFilterGraph*, AVFilterInOut*))
>>> referenced by qavaudioinputfilter.cpp:101
>>> .obj/qavaudioinputfilter.o:(QAVAudioInputFilter::configure(AVFilterGraph*, AVFilterInOut*))
>>> referenced by qavvideooutputfilter.cpp:39
>>> .obj/qavvideooutputfilter.o:(QAVVideoOutputFilter::configure(AVFilterGraph*, AVFilterInOut*))
>>> referenced 1 more times
clang-12: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [../../lib/libQt6AVPlayer_arm64-v8a.so] Error 1
make[1]: *** [sub-QtAVPlayer-make_first] Error 2
make: *** [sub-src-make_first] Error 2
May be a hint as to where to get the prebuilt Android ffmpeg libraries might be sufficient to solve this, unless there is a step I was missing.
At least when developing for Android or iOS it could be very helpful if QtAVPlayer could get configured to use the ffmpeg provided with Qt 6.4.3 and later, as discussed in #276
Although I have a lot of experience with ffmpeg, including compiling it on Mac and Linux, I struggle with doing so for Android and iOS. Therefore I propose to add a link or hint to the build instructions to point to working (and recent) prebuilt libraries or to good instructions.
About this issue
- Original URL
- State: closed
- Created a year ago
- Comments: 35 (14 by maintainers)
Awesome that you tried this, not obvious to change ffmpeg ? *-)
After it was clear that video decoding might be the problem, I thought it might be good to try a different set of ffmpeg libraries. I had used the ones from ffmpegKit, but had a funny feeling with them.
Now I have built new ffmeg 5.1.3 libraries using https://github.com/Javernaut/ffmpeg-android-maker and surprise surprise, it works, great and fast, Video 24 fps, QML 24 fps, audio and video quality perfect!!!
Thanks for your help, it allowed me to exclude step by step other possibilities, until the problem was found.
You can’t imagine how exited I am to finally see a way to kick out QTMM not only on Linux/Mac/Windows, where I work with ffmpeg directly forever, but now also on Android, and after that hopefully on iOS! 😃 😃 😃
So the QtAVPlayer.pro in src/QtAVPlayer/QtAVPlayer.pro needs to get modified as above, the working line is
Thanks and thanks for this great project!
“…or missing” that was it. It links and installs QtAVPlayer to ‘Qt/6.4.3/android_arm64_v8a’ now , after adding lavdevice and lavfilter :