我正在尝试在我公司正在开发的视频流应用程序中添加对 decklink 设备的支持。我们使用 C++ 和 FFMpeg 作为处理库。其他类型的输入和输出正在工作。添加对decklink输入的支持非常简单,它只是工作(至少在我们测试它的设备上——DeckLink SDI Quad)。但是对于输出......到目前为止,我已经为此奋斗了 3 天,但没有任何结果。我找不到任何文档,也找不到任何代码示例,我应该如何初始化 AVFormatContext 和其他需要的部分。
通过阅读FFMpeg 的decklink avdevice 代码,我设法了解AVFormatContext 不再抱怨不正确的数据格式。我正在使用 Wrapped_avframe 和 pcm_s16le 作为编解码器,我正在将视频和音频参数设置(转换)为设备接受的值,我正在发送带有 av_interleaved_write_frame 的 AVPackets,但它不起作用。正在接受几个数据包,产生了几个 libDeckLinkAPI.so 线程,并且它只是锁定了 - 我的输出线程锁定了对 av_interleaved_write_frame 的一些 80-ish 调用。这是一个僵局,它永远不会继续下去。调试器仅显示它正在等待某些东西:
#0 futex_wait_cancelable (private=<optimized out>, expected=0, futex_word=0x7fe34c0402c8) at ../sysdeps/nptl/futex-internal.h:183
#1 __pthread_cond_wait_common (abstime=0x0, clockid=0, mutex=0x7fe34c040178, cond=0x7fe34c0402a0) at pthread_cond_wait.c:508
#2 __pthread_cond_wait (cond=0x7fe34c0402a0, mutex=0x7fe34c040178) at pthread_cond_wait.c:638
#3 0x00007fe35c69bd04 in ?? () from /lib/libDeckLinkAPI.so
#4 0x00007fe371394ac7 in ?? () from /lib/libavdevice.so.58
#5 0x00007fe370f249ad in ?? () from /lib/libavformat.so.58
#6 0x00007fe370f26615 in av_interleaved_write_frame () from /lib/libavformat.so.58
我显然做错了什么,但我找不到什么......谁能指出我应该如何完成一些文档或(工作)代码示例?
提前致谢 :)