Files
fmviewer3/project/fm_viewer/fav/AVTranscoder.h
2026-02-21 17:11:31 +09:00

157 lines
4.9 KiB
C++

/******************************************************************************
QtAV: Multimedia framework based on Qt and FFmpeg
Copyright (C) (2012-2016) Wang Bin <wbsecg1@gmail.com>
* This file is part of QtAV (from 2015)
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
******************************************************************************/
#ifndef QTAV_AVTRANSCODE_H
#define QTAV_AVTRANSCODE_H
#include "MediaIO.h"
#include "AudioEncoder.h"
#include "VideoEncoder.h"
#if !(REMOVE_AV_ENCODER)
namespace FAV {
class AVPlayer;
class Q_AV_EXPORT AVTranscoder : public QObject
{
Q_OBJECT
public:
AVTranscoder(QObject* parent = 0);
~AVTranscoder();
// TODO: other source (more operations needed, e.g. seek)?
void setMediaSource(AVPlayer* player);
AVPlayer* sourcePlayer() const;
QString outputFile() const;
QIODevice* outputDevice() const;
MediaIO* outputMediaIO() const;
/*!
* \brief setOutputMedia
*/
void setOutputMedia(const QString& fileName);
void setOutputMedia(QIODevice* dev);
void setOutputMedia(MediaIO* io);
/*!
* \brief setOutputFormat
* Force the output format. Useful for custom io
*/
void setOutputFormat(const QString& fmt);
QString outputFormatForced() const;
void setOutputOptions(const QVariantHash &dict);
QVariantHash outputOptions() const;
/*!
* \brief setAsync
* Enable async encoding. Default is disabled.
*/
void setAsync(bool value = true);
bool isAsync() const;
/*!
* \brief createEncoder
* Destroy old encoder and create a new one in filter chain. Filter has the ownership. You shall not manually open it. Transcoder will set the missing parameters open it.
* \param name registered encoder name, for example "FFmpeg"
* \return false if failed
*/
bool createVideoEncoder(const QString& name = QLatin1String("FFmpeg"));
/*!
* \brief encoder
* Use this to set encoder properties and options.
* If frameRate is not set, source frame rate will be set if it's valid, otherwise VideoEncoder::defaultFrameRate() will be used internally
* Do not call open()/close() manually
* \return Encoder instance or null if createVideoEncoder failed
*/
VideoEncoder* videoEncoder() const;
/*!
* \brief createEncoder
* Destroy old encoder and create a new one in filter chain. Filter has the ownership. You shall not manually open it. Transcoder will set the missing parameters open it.
* \param name registered encoder name, for example "FFmpeg"
* \return false if failed
*/
bool createAudioEncoder(const QString& name = QLatin1String("FFmpeg"));
/*!
* \brief encoder
* Use this to set encoder properties and options.
* Do not call open()/close() manually
* \return Encoder instance or null if createAudioEncoder failed
*/
AudioEncoder* audioEncoder() const;
/*!
* \brief isRunning
* \return true if encoding started
*/
bool isRunning() const;
bool isPaused() const;
qint64 encodedSize() const;
qreal startTimestamp() const;
qreal encodedDuration() const;
/*!
* \brief startTime
* Start to encode after startTime(). To decode from a given time, call sourcePlayer()->setPosition()
*/
qint64 startTime() const;
void setStartTime(qint64 ms);
Q_SIGNALS:
void videoFrameEncoded(qreal timestamp);
void audioFrameEncoded(qreal timestamp);
void started();
void stopped();
void paused(bool value);
void startTimeChanged(qint64 ms);
void asyncChanged();
public Q_SLOTS:
void start();
/*!
* \brief stop
* Call stop() to encode delayed frames remains in encoder and then stop encoding.
* It's called internally when sourcePlayer() is stopped
*/
void stop();
/*!
* \brief pause
* pause the encoders
* \param value
*/
void pause(bool value);
private Q_SLOTS:
void onSourceStarted();
void prepareMuxer();
void writeAudio(const FAV::Packet& packet);
void writeVideo(const FAV::Packet& packet);
void tryFinish();
private:
void stopInternal();
class Private;
QScopedPointer<Private> d;
};
} //namespace FAV
#endif // QTAV_AVTRANSCODE_H
#endif // #if !(REMOVE_AV_ENCODER)