Recherche avancée

Médias (1)

Mot : - Tags -/intégration

Autres articles (48)

  • Les autorisations surchargées par les plugins

    27 avril 2010, par

    Mediaspip core
    autoriser_auteur_modifier() afin que les visiteurs soient capables de modifier leurs informations sur la page d’auteurs

  • Support audio et vidéo HTML5

    10 avril 2011

    MediaSPIP utilise les balises HTML5 video et audio pour la lecture de documents multimedia en profitant des dernières innovations du W3C supportées par les navigateurs modernes.
    Pour les navigateurs plus anciens, le lecteur flash Flowplayer est utilisé.
    Le lecteur HTML5 utilisé a été spécifiquement créé pour MediaSPIP : il est complètement modifiable graphiquement pour correspondre à un thème choisi.
    Ces technologies permettent de distribuer vidéo et son à la fois sur des ordinateurs conventionnels (...)

  • HTML5 audio and video support

    13 avril 2011, par

    MediaSPIP uses HTML5 video and audio tags to play multimedia files, taking advantage of the latest W3C innovations supported by modern browsers.
    The MediaSPIP player used has been created specifically for MediaSPIP and can be easily adapted to fit in with a specific theme.
    For older browsers the Flowplayer flash fallback is used.
    MediaSPIP allows for media playback on major mobile platforms with the above (...)

Sur d’autres sites (7055)

  • Dynamically created QImage frames to ffmpeg stdin using QThread

    11 mai 2021, par musicamante

    I am trying to create video files with ffmpeg using frames dynamically created on a separate thread.

    


    While I can create those frames and store them on disk/memory, I'd like to avoid that passage since the amount/size of the frames can be high and many "jobs" could be created with different format or options. But, also importantly, I'd like to better understand the logic behind this, as I admit I've not a very deep knowledge on how thread/processing actually works.

    


    Right now I'm trying to create the QProcess in the QThread object, and then run the image creation thread as soon as the process is started, but it doesn't seem to work : no file is created, and I don't even get any output from standard error (but I know I should, since I can get it if I don't use the thread).

    


    Unfortunately, due to my little knowledge on how QProcess deals with threads and piping (and, obviously, all possible ffmpeg options), I really don't understand how can achieve this.

    


    Besides obviously getting the output file created, the expected result is to be able to launch the encoding (and possibly queue more encodings in the meantime) while keeping the UI responding and get notifications of the current processing state.

    


    import re&#xA;from PyQt5 import QtCore, QtGui, QtWidgets&#xA;&#xA;logRegExp = r&#x27;(?:(n:\s&#x2B;)(?P\d&#x2B;)\s).*(?:(pts_time:\s*)(?P<time>\d&#x2B;.\d*))&#x27;&#xA;&#xA;class Encoder(QtCore.QThread):&#xA;    completed = QtCore.pyqtSignal()&#xA;    frameDone = QtCore.pyqtSignal(object)&#xA;    def __init__(self, width=1280, height=720, frameCount=100):&#xA;        super().__init__()&#xA;        self.width = width&#xA;        self.height = height&#xA;        self.frameCount = frameCount&#xA;&#xA;    def start(self):&#xA;        self.currentLog = &#x27;&#x27;&#xA;        self.currentData = bytes()&#xA;        self.process = QtCore.QProcess()&#xA;        self.process.setReadChannel(self.process.StandardError)&#xA;        self.process.finished.connect(self.completed)&#xA;        self.process.readyReadStandardError.connect(self.stderr)&#xA;        self.process.started.connect(super().start)&#xA;        self.process.start(&#x27;ffmpeg&#x27;, [&#xA;            &#x27;-y&#x27;, &#xA;            &#x27;-f&#x27;, &#x27;png_pipe&#x27;, &#xA;            &#x27;-i&#x27;, &#x27;-&#x27;, &#xA;            &#x27;-c:v&#x27;, &#x27;libx264&#x27;, &#xA;            &#x27;-b:v&#x27;, &#x27;800k&#x27;, &#xA;            &#x27;-an&#x27;, &#xA;            &#x27;-vf&#x27;, &#x27;showinfo&#x27;,&#xA;            &#x27;/tmp/test.h264&#x27;, &#xA;        ])&#xA;&#xA;    def stderr(self):&#xA;        self.currentLog &#x2B;= str(self.process.readAllStandardError(), &#x27;utf-8&#x27;)&#xA;        *lines, self.currentLog = self.currentLog.split(&#x27;\n&#x27;)&#xA;        for line in lines:&#xA;            print(&#x27;STDERR: {}&#x27;.format(line))&#xA;            match = re.search(logRegExp, line)&#xA;            if match:&#xA;                data = match.groupdict()&#xA;                self.frameDone.emit(int(data[&#x27;frame&#x27;]))&#xA;&#xA;    def run(self):&#xA;        font = QtGui.QFont()&#xA;        font.setPointSize(80)&#xA;        rect = QtCore.QRect(0, 0, self.width, self.height)&#xA;        for frame in range(1, self.frameCount &#x2B; 1):&#xA;            img = QtGui.QImage(QtCore.QSize(self.width, self.height), QtGui.QImage.Format_ARGB32)&#xA;            img.fill(QtCore.Qt.white)&#xA;            qp = QtGui.QPainter(img)&#xA;            qp.setFont(font)&#xA;            qp.setPen(QtCore.Qt.black)&#xA;            qp.drawText(rect, QtCore.Qt.AlignCenter, &#x27;Frame {}&#x27;.format(frame))&#xA;            qp.end()&#xA;            img.save(self.process, &#x27;PNG&#x27;)&#xA;        print(&#x27;frame creation complete&#x27;)&#xA;&#xA;&#xA;class Test(QtWidgets.QWidget):&#xA;    def __init__(self):&#xA;        super().__init__()&#xA;        layout = QtWidgets.QVBoxLayout(self)&#xA;        self.startButton = QtWidgets.QPushButton(&#x27;Start&#x27;)&#xA;        layout.addWidget(self.startButton)&#xA;&#xA;        self.frameLabel = QtWidgets.QLabel()&#xA;        layout.addWidget(self.frameLabel)&#xA;&#xA;        self.process = Encoder()&#xA;        self.process.completed.connect(lambda: self.startButton.setEnabled(True))&#xA;        self.process.frameDone.connect(self.frameLabel.setNum)&#xA;        self.startButton.clicked.connect(self.create)&#xA;&#xA;    def create(self):&#xA;        self.startButton.setEnabled(False)&#xA;        self.process.start()&#xA;&#xA;&#xA;import sys&#xA;app = QtWidgets.QApplication(sys.argv)&#xA;test = Test()&#xA;test.show()&#xA;sys.exit(app.exec_())&#xA;</time>

    &#xA;

    If I add the following lines at the end of run(), then the file is actually created and I get the stderr output, but I can see that it's processed after the completion of the for cycle, which obviously is not the expected result :

    &#xA;

        self.process.closeWriteChannel()&#xA;    self.process.waitForFinished()&#xA;    self.process.terminate()&#xA;

    &#xA;

    Bonus : I'm on Linux, I don't know if it works differently on Windows (and I suppose it would work similarly on MacOS), but in any case I'd like to know if there are differences and how to possibly deal with them.

    &#xA;

  • Adding Text to Video with ffmpeg in Flutter

    9 mars 2024, par Aiman

    I am trying to add text to a video using ffmpeg package but it returns an error i.e. Return Code 1&#xA;Here's my code.

    &#xA;

      final videoPath = _controller.file.path;&#xA;  final outputName = videoPath.hashCode.toString();&#xA;&#xA;  final output =&#xA;        File(&#x27;${(await getTemporaryDirectory()).path}/$outputName.mp4&#x27;);&#xA;&#xA;  String command =&#xA;        "-y -i $videoPath -filter_complex &#x27;[0]scale=540:-1[s];[s]drawtext=fontfile=/storage/emulated/0/Download/SuperDessert.ttf:text=&#x27;MY_TEXT&#x27;:fontsize=24:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2&#x27; ${output.path}";&#xA;&#xA;  final session = await FFmpegKit.execute(command);&#xA;&#xA;  final returnCode = await session.getReturnCode();&#xA;&#xA;  if (ReturnCode.isSuccess(returnCode)) {&#xA;    log("Success full text added");&#xA;  } else {&#xA;    log("Error adding text: ${await session.getFailStackTrace()}");&#xA;  }&#xA;

    &#xA;

    I have tried changing the output directory, changed fontfile to font

    &#xA;

  • File Decryption in (AESMode.ctr) mode showing Exception Failed to decode data using encoding 'utf-8' in dart ?

    20 novembre 2020, par Jai

    While decoding the video file using aes-ctr mode am getting error like below,

    &#xA;

    Unhandled Exception: FileSystemException: Failed to decode data using encoding &#x27;utf-8&#x27;

    &#xA;

    Used ffmpeg for encrypting file :

    &#xA;

    ffmpeg -i samplevideo.mp4 -vcodec copy -acodec copy -encryption_scheme cenc-aes-ctr -encryption_key 76a6c65c5ea762046bd749a2e632ccbb -encryption_kid a7e61c373e219033c21091fa607bf3b8 enc_v1_file.mp4

    &#xA;

    Used Dart to decode video file :

    &#xA;

    Future<string> decryptFile(filePath) async {&#xA;    // filePath - Local encrypted file path&#xA;    var encodedKey = &#x27;NzZhNmM2NWM1ZWE3NjIwNDZiZDc0OWEyZTYzMmNjYmI=&#x27;;&#xA;    var encodedIv = &#x27;YTdlNjFjMzczZTIxOTAzM2MyMTA5MWZhNjA3YmYzYjg=&#x27;;&#xA;    var encryptedBase64EncodedString = new File(filePath).readAsStringSync();&#xA;    var decoded = base64.decode(encryptedBase64EncodedString); // Error in this line&#xA;    final key1 = enc.Key.fromBase64(encodedKey);&#xA;    final iv = enc.IV.fromBase64(encodedIv);&#xA;    final encrypter = enc.Encrypter(enc.AES(key1, mode: enc.AESMode.ctr));&#xA;    final decrypted = encrypter.decryptBytes(enc.Encrypted(decoded), iv: iv);&#xA;    final filename = &#x27;${p.basenameWithoutExtension(filePath)}.mp4&#x27;;&#xA;    final directoryName = p.dirname(filePath);&#xA;    final newFilePath = p.join(directoryName, filename);&#xA;    var newFile = new File(newFilePath);&#xA;    await newFile.writeAsBytes(decrypted);&#xA;    return newFilePath;&#xA;}&#xA;</string>

    &#xA;