FFmpeg: Support audio-only recording

This commit is contained in:
Vicki Pfau 2019-05-14 14:25:20 -07:00
parent fd7989e748
commit 3e86eeda70
3 changed files with 20 additions and 4 deletions

View File

@ -57,6 +57,7 @@ Misc:
- Debugger: Print breakpoint/watchpoint number when inserting
- Qt: Open a message box for Qt frontend errors
- GBA Video: Clean up dead code in sprite rendering loop
- FFmpeg: Support audio-only recording
0.7.1: (2019-02-24)
Bugfixes:

View File

@ -55,10 +55,12 @@ void FFmpegEncoderInit(struct FFmpegEncoder* encoder) {
encoder->absf = NULL;
encoder->context = NULL;
encoder->scaleContext = NULL;
encoder->audio = NULL;
encoder->audioStream = NULL;
encoder->audioFrame = NULL;
encoder->audioBuffer = NULL;
encoder->postaudioBuffer = NULL;
encoder->video = NULL;
encoder->videoStream = NULL;
encoder->videoFrame = NULL;
}
@ -146,6 +148,12 @@ bool FFmpegEncoderSetVideo(struct FFmpegEncoder* encoder, const char* vcodec, un
{ AV_PIX_FMT_YUV444P, 5 },
{ AV_PIX_FMT_YUV420P, 6 }
};
if (!vcodec) {
encoder->videoCodec = 0;
return true;
}
AVCodec* codec = avcodec_find_encoder_by_name(vcodec);
if (!codec) {
return false;
@ -189,13 +197,13 @@ bool FFmpegEncoderVerifyContainer(struct FFmpegEncoder* encoder) {
AVOutputFormat* oformat = av_guess_format(encoder->containerFormat, 0, 0);
AVCodec* acodec = avcodec_find_encoder_by_name(encoder->audioCodec);
AVCodec* vcodec = avcodec_find_encoder_by_name(encoder->videoCodec);
if ((encoder->audioCodec && !acodec) || !vcodec || !oformat) {
if ((encoder->audioCodec && !acodec) || (encoder->videoCodec && !vcodec) || !oformat) {
return false;
}
if (encoder->audioCodec && !avformat_query_codec(oformat, acodec->id, FF_COMPLIANCE_EXPERIMENTAL)) {
return false;
}
if (!avformat_query_codec(oformat, vcodec->id, FF_COMPLIANCE_EXPERIMENTAL)) {
if (encoder->videoCodec && !avformat_query_codec(oformat, vcodec->id, FF_COMPLIANCE_EXPERIMENTAL)) {
return false;
}
return true;
@ -562,7 +570,7 @@ void _ffmpegPostAudioFrame(struct mAVStream* stream, int16_t left, int16_t right
void _ffmpegPostVideoFrame(struct mAVStream* stream, const color_t* pixels, size_t stride) {
struct FFmpegEncoder* encoder = (struct FFmpegEncoder*) stream;
if (!encoder->context) {
if (!encoder->context || !encoder->videoCodec) {
return;
}
stride *= BYTES_PER_PIXEL;
@ -606,6 +614,9 @@ void _ffmpegPostVideoFrame(struct mAVStream* stream, const color_t* pixels, size
static void _ffmpegSetVideoDimensions(struct mAVStream* stream, unsigned width, unsigned height) {
struct FFmpegEncoder* encoder = (struct FFmpegEncoder*) stream;
if (!encoder->context || !encoder->videoCodec) {
return;
}
encoder->iwidth = width;
encoder->iheight = height;
if (encoder->scaleContext) {

View File

@ -275,7 +275,11 @@ void VideoView::setAudioCodec(const QString& codec, bool manual) {
void VideoView::setVideoCodec(const QString& codec, bool manual) {
free(m_videoCodecCstr);
m_videoCodec = sanitizeCodec(codec, s_vcodecMap);
m_videoCodecCstr = strdup(m_videoCodec.toUtf8().constData());
if (m_videoCodec == "none") {
m_videoCodecCstr = nullptr;
} else {
m_videoCodecCstr = strdup(m_videoCodec.toUtf8().constData());
}
if (!FFmpegEncoderSetVideo(&m_encoder, m_videoCodecCstr, m_vbr)) {
free(m_videoCodecCstr);
m_videoCodecCstr = nullptr;