Skip to content

Commit d655390

Browse files
capture audio from CEF
1 parent de95e02 commit d655390

File tree

7 files changed

+197
-58
lines changed

7 files changed

+197
-58
lines changed

src/core/frame/frame.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ const array<std::uint8_t>& mutable_frame::image_data(std::size_t index) const {
8282
const array<std::int32_t>& mutable_frame::audio_data() const { return impl_->audio_data_; }
8383
array<std::uint8_t>& mutable_frame::image_data(std::size_t index) { return impl_->image_data_.at(index); }
8484
array<std::int32_t>& mutable_frame::audio_data() { return impl_->audio_data_; }
85+
void mutable_frame::set_audio_data(caspar::array<int32_t>&& audio) { impl_->audio_data_ = std::move(audio); }
8586
std::size_t mutable_frame::width() const { return impl_->desc_.planes.at(0).width; }
8687
std::size_t mutable_frame::height() const { return impl_->desc_.planes.at(0).height; }
8788
const frame_geometry& mutable_frame::geometry() const { return impl_->geometry_; }

src/core/frame/frame.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class mutable_frame final
3030
~mutable_frame();
3131

3232
mutable_frame& operator=(const mutable_frame&) = delete;
33-
mutable_frame& operator =(mutable_frame&& other);
33+
mutable_frame& operator=(mutable_frame&& other);
3434

3535
void swap(mutable_frame& other);
3636

@@ -41,6 +41,7 @@ class mutable_frame final
4141

4242
array<std::int32_t>& audio_data();
4343
const array<std::int32_t>& audio_data() const;
44+
void set_audio_data(caspar::array<int32_t>&& audio);
4445

4546
std::size_t width() const;
4647

src/modules/ffmpeg/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ set(SOURCES
55
producer/av_producer.cpp
66
producer/av_input.cpp
77
util/av_util.cpp
8+
util/audio_resampler.cpp
89
producer/ffmpeg_producer.cpp
910
consumer/ffmpeg_consumer.cpp
1011
ffmpeg.cpp
@@ -14,6 +15,7 @@ set(HEADERS
1415
producer/av_producer.h
1516
producer/av_input.h
1617
util/av_util.h
18+
util/audio_resampler.h
1719
producer/ffmpeg_producer.h
1820
consumer/ffmpeg_consumer.h
1921
ffmpeg.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#include "audio_resampler.h"
2+
#include "av_assert.h"
3+
4+
extern "C" {
5+
#include <libavutil/samplefmt.h>
6+
#include <libswresample/swresample.h>
7+
}
8+
9+
namespace caspar { namespace ffmpeg {
10+
11+
AudioResampler::AudioResampler(int64_t sample_rate, AVSampleFormat in_sample_fmt)
12+
: ctx(std::shared_ptr<SwrContext>(swr_alloc_set_opts(nullptr,
13+
AV_CH_LAYOUT_7POINT1,
14+
AV_SAMPLE_FMT_S32,
15+
sample_rate,
16+
AV_CH_LAYOUT_7POINT1,
17+
in_sample_fmt,
18+
sample_rate,
19+
0,
20+
nullptr),
21+
[](SwrContext* ptr) { swr_free(&ptr); }))
22+
{
23+
if (!ctx)
24+
FF_RET(AVERROR(ENOMEM), "swr_alloc_set_opts");
25+
26+
FF_RET(swr_init(ctx.get()), "swr_init");
27+
}
28+
29+
caspar::array<int32_t> AudioResampler::convert(int frames, const void** src)
30+
{
31+
auto result = caspar::array<int32_t>(frames * 8 * sizeof(int32_t));
32+
auto ptr = result.data();
33+
auto ret = swr_convert(ctx.get(), (uint8_t**)&ptr, frames, reinterpret_cast<const uint8_t**>(src), frames);
34+
35+
return result;
36+
}
37+
38+
}}; // namespace caspar::ffmpeg
+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#include <common/array.h>
2+
#include <memory>
3+
4+
extern "C" {
5+
#include <libavutil/samplefmt.h>
6+
}
7+
8+
struct SwrContext;
9+
10+
namespace caspar { namespace ffmpeg {
11+
12+
class AudioResampler
13+
{
14+
std::shared_ptr<SwrContext> ctx;
15+
16+
public:
17+
AudioResampler(int64_t sample_rate, AVSampleFormat in_sample_fmt);
18+
19+
AudioResampler(const AudioResampler&) = delete;
20+
AudioResampler& operator=(const AudioResampler&) = delete;
21+
22+
caspar::array<int32_t> convert(int frames, const void** src);
23+
};
24+
25+
}}; // namespace caspar::ffmpeg

src/modules/html/CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ include_directories(../..)
2121
include_directories(${BOOST_INCLUDE_PATH})
2222
include_directories(${TBB_INCLUDE_PATH})
2323
include_directories(${CEF_INCLUDE_PATH})
24+
include_directories(${FFMPEG_INCLUDE_PATH})
2425

2526
set_target_properties(html PROPERTIES FOLDER modules)
2627
source_group(sources\\producer producer/*)
@@ -29,7 +30,7 @@ source_group(sources ./*)
2930
target_link_libraries(html
3031
common
3132
core
32-
33+
ffmpeg
3334
${CEF_BIN_PATH}/libcef.so
3435
${CEF_BIN_PATH}/libcef_dll_wrapper.a
3536
)

0 commit comments

Comments
 (0)