Recherche avancée

Médias (33)

Mot : - Tags -/creative commons

Autres articles (65)

  • MediaSPIP version 0.1 Beta

    16 avril 2011, par

    MediaSPIP 0.1 beta est la première version de MediaSPIP décrétée comme "utilisable".
    Le fichier zip ici présent contient uniquement les sources de MediaSPIP en version standalone.
    Pour avoir une installation fonctionnelle, il est nécessaire d’installer manuellement l’ensemble des dépendances logicielles sur le serveur.
    Si vous souhaitez utiliser cette archive pour une installation en mode ferme, il vous faudra également procéder à d’autres modifications (...)

  • MediaSPIP 0.1 Beta version

    25 avril 2011, par

    MediaSPIP 0.1 beta is the first version of MediaSPIP proclaimed as "usable".
    The zip file provided here only contains the sources of MediaSPIP in its standalone version.
    To get a working installation, you must manually install all-software dependencies on the server.
    If you want to use this archive for an installation in "farm mode", you will also need to proceed to other manual (...)

  • Amélioration de la version de base

    13 septembre 2013

    Jolie sélection multiple
    Le plugin Chosen permet d’améliorer l’ergonomie des champs de sélection multiple. Voir les deux images suivantes pour comparer.
    Il suffit pour cela d’activer le plugin Chosen (Configuration générale du site > Gestion des plugins), puis de configurer le plugin (Les squelettes > Chosen) en activant l’utilisation de Chosen dans le site public et en spécifiant les éléments de formulaires à améliorer, par exemple select[multiple] pour les listes à sélection multiple (...)

Sur d’autres sites (7805)

  • Open cv.VideoCapture(index) - ffmpeg list camera names - How to match ?

    15 novembre 2024, par Chris P
        def fetch_camera_input_settings(self):
        try:
            self.database_functions = database_functions

            self.camera_input_device_name = database_functions.read_setting("camera_input_device_name")["value"]
            self.camera_input_device_number = int(self.database_functions.read_setting("camera_input_device_number")["value"])

            self.camera_input_devices = [[0,-1,"Καμία συσκευή κάμερας"]]
            self.available_cameras = [{"device_index":-1,"device_name":"Καμία συσκευή κάμερας"}]

            # FFmpeg command to list video capture devices on Windows
            cmd = ["ffmpeg", "-list_devices", "true", "-f", "dshow", "-i", "dummy"]
            result = subprocess.run(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
            output = result.stderr  # FFmpeg sends device listing to stderr

            # Updated regular expression to capture both video and audio devices
            device_pattern = re.compile(r'\[dshow @ .+?\] "(.*?)" \(video\)')
            cameras = device_pattern.findall(output)
            counter = 0
            for camera in cameras:
                counter += 1
                self.camera_input_devices.append([counter,counter-1,camera])
                self.available_cameras.append({"device_index": counter-1, "device_name": camera})

            self.to_emitter.send({"type":"available_devices","devices":self.camera_input_devices,"device_index":self.camera_input_device_number})
        except:
            error_message = traceback.format_exc()
            self.to_emitter.send({"type":"error","error_message":error_message})



    


    How to match ffmpeg camera device names output with cv2.VideoCapture which wants camera index as input ?

    


  • How to use ffmpeg to open 2 cams and push the stream from one of them ?

    23 septembre 2024, par kkk123

    I'm using ffmpeg to capture 2 cams and push stream from one of them.

    


    For single camera, I start capturing frames by calling startCameraCapture() from main() which calls initRemoteStream(). Here it opens a pipe to ffmpeg to initialize streaming. Followed by it, decodePacket() is called which writes YUV422 data to the pipe. It runs fine.

    


    But when I want to use 2 cameras, I create a thread for each camera in main() and define active_cam. When I want to push cam1's stream, active_cam = 1. The same logic of the single cam is used. It doesn't work.

    


    Could you please help to understand the logic ? Following is my C++ code. Thanks.

    


    #include <iostream>&#xA;#include <thread>&#xA;#include <atomic>&#xA;#include <mutex>&#xA;#include &#xA;#include <queue>&#xA;#include <opencv2></opencv2>opencv.hpp>&#xA;&#xA;extern "C" {&#xA;#include <libavcodec></libavcodec>avcodec.h>&#xA;#include <libavformat></libavformat>avformat.h>&#xA;#include <libavutil></libavutil>imgutils.h>&#xA;#include <libavutil></libavutil>opt.h>&#xA;#include <libswscale></libswscale>swscale.h>&#xA;#include <libavdevice></libavdevice>avdevice.h>&#xA;}&#xA;&#xA;// 定义全局变量&#xA;std::queue frame_queue1, frame_queue2;&#xA;std::mutex queue_mutex1, queue_mutex2;&#xA;std::condition_variable cv1, cv2;&#xA;std::atomic<bool> keep_running(true);&#xA;FILE* pipe_s1 = nullptr;&#xA;FILE* pipe_s2 = nullptr;&#xA;&#xA;// 初始化推流&#xA;FILE* initRemoteStream(int camera_id) {&#xA;    std::string ffmpegCmd = "ffmpeg -y -f rawvideo -vcodec rawvideo -pix_fmt yuv422 -s 1920x1080 -r 30 -i - -vf scale 1280x720 -c:v libx264 -f rtsp rtsp://192.168.66.126/live/stream" &#x2B; std::to_string(camera_id);&#xA;    FILE* pipe_s = popen(ffmpegCmd.c_str(), "w");&#xA;    if (!pipe_s) {&#xA;        std::cerr &lt;&lt; "无法启动 FFmpeg 进程" &lt;&lt; std::endl;&#xA;        return nullptr;&#xA;    }&#xA;    return pipe_s;&#xA;}&#xA;&#xA;// 解码数据包&#xA;bool decodePacket(AVCodecContext *codec_ctx, AVPacket *packet, int video_stream_index, cv::Mat&amp; global_frame, std::queue&amp; frame_queue, std::condition_variable&amp; cv) {&#xA;    AVFrame *frame = av_frame_alloc();&#xA;    int ret;&#xA;&#xA;    if (packet->stream_index == video_stream_index) {&#xA;        ret = avcodec_send_packet(codec_ctx, packet);&#xA;        if (ret &lt; 0) return false;&#xA;&#xA;        ret = avcodec_receive_frame(codec_ctx, frame);&#xA;        if (ret &lt; 0) return false;&#xA;&#xA;        int width = codec_ctx->width;&#xA;        int height = codec_ctx->height;&#xA;&#xA;        // 创建 YUV422 格式的 Mat 对象&#xA;        cv::Mat yuv422_img(height, width, CV_8UC2, frame->data[0]);&#xA;&#xA;        // 将 YUV422 转换为 BGR&#xA;        //cv::cvtColor(yuv422_img, global_frame, cv::COLOR_YUV2BGR_YUY2);&#xA;        &#xA;        {&#xA;            std::lock_guard lock(queue_mutex1);&#xA;            frame_queue.push(global_frame.clone());&#xA;            cv.notify_one();&#xA;        }&#xA;    }&#xA;&#xA;    av_frame_free(&amp;frame);&#xA;    return true;&#xA;}&#xA;&#xA;&#xA;// 摄像头捕获线程&#xA;void startCameraCapture(const char* device_name, int camera_id) {&#xA;    AVFormatContext *format_ctx = nullptr;&#xA;    AVCodecContext *codec_ctx = nullptr;&#xA;    const AVCodec *codec = nullptr;&#xA;    AVPacket packet;&#xA;    int video_stream_index = -1;&#xA;&#xA;    avdevice_register_all();&#xA;    avformat_network_init();&#xA;&#xA;    AVDictionary *options = nullptr;&#xA;    av_dict_set(&amp;options, "video_size", "640x480", 0);&#xA;    av_dict_set(&amp;options, "framerate", "30", 0);&#xA;    AVInputFormat *input_format = av_find_input_format("v4l2");&#xA;&#xA;    if (avformat_open_input(&amp;format_ctx, device_name, input_format, &amp;options) != 0) {&#xA;        std::cerr &lt;&lt; "无法打开输入" &lt;&lt; std::endl;&#xA;        return;&#xA;    }&#xA;&#xA;    if (avformat_find_stream_info(format_ctx, nullptr) &lt; 0) return;&#xA;&#xA;    for (unsigned int i = 0; i &lt; format_ctx->nb_streams; i&#x2B;&#x2B;) {&#xA;        if (format_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {&#xA;            video_stream_index = i;&#xA;            break;&#xA;        }&#xA;    }&#xA;&#xA;    AVCodecParameters *codec_par = format_ctx->streams[video_stream_index]->codecpar;&#xA;    codec = avcodec_find_decoder(codec_par->codec_id);&#xA;    codec_ctx = avcodec_alloc_context3(codec);&#xA;    avcodec_parameters_to_context(codec_ctx, codec_par);&#xA;    avcodec_open2(codec_ctx, codec, nullptr);&#xA;&#xA;    // 初始化推流&#xA;    FILE* pipe_s = initRemoteStream(camera_id);&#xA;    if (camera_id == 1) {&#xA;        pipe_s1 = pipe_s;&#xA;    } else {&#xA;        pipe_s2 = pipe_s;&#xA;    }&#xA;&#xA;    while (keep_running) {&#xA;        if (av_read_frame(format_ctx, &amp;packet) >= 0) {&#xA;            cv::Mat global_frame;&#xA;            if (decodePacket(codec_ctx, &amp;packet, video_stream_index, global_frame, (camera_id == 1 ? frame_queue1 : frame_queue2), (camera_id == 1 ? cv1 : cv2))) {&#xA;                av_packet_unref(&amp;packet);&#xA;            }&#xA;        }&#xA;    }&#xA;&#xA;    avcodec_free_context(&amp;codec_ctx);&#xA;    avformat_close_input(&amp;format_ctx);&#xA;    pclose(pipe_s);&#xA;}&#xA;&#xA;// 推理线程&#xA;void inferenceThread() {&#xA;    while (keep_running) {&#xA;        cv::Mat frame1, frame2;&#xA;&#xA;        {&#xA;            std::unique_lock lock(queue_mutex1);&#xA;            cv1.wait(lock, [] { return !frame_queue1.empty(); });&#xA;            frame1 = frame_queue1.front();&#xA;            frame_queue1.pop();&#xA;        }&#xA;&#xA;        {&#xA;            std::unique_lock lock(queue_mutex2);&#xA;            cv2.wait(lock, [] { return !frame_queue2.empty(); });&#xA;            frame2 = frame_queue2.front();&#xA;            frame_queue2.pop();&#xA;        }&#xA;&#xA;        // 进行推理处理 &#xA;&#xA;        // 根据CAN信号决定推流&#xA;        int selected_camera_id = 1; // 假设根据CAN信号确定的摄像头ID&#xA;        FILE* selected_pipe_s = (selected_camera_id == 1) ? pipe_s1 : pipe_s2; // 选择相应的推流管道&#xA;&#xA;        if (selected_pipe_s) {&#xA;            fwrite(selected_camera_id == 1 ? frame1.data : frame2.data, 1, (selected_camera_id == 1 ? frame1.total() : frame2.total()) * frame1.elemSize(), selected_pipe_s);&#xA;        }&#xA;    }&#xA;}&#xA;&#xA;int main(int argc, char *argv[]) {&#xA;    std::thread camera1(startCameraCapture, "/dev/video0", 1);&#xA;    std::thread camera2(startCameraCapture, "/dev/video1", 2);&#xA;    std::thread infer_thread(inferenceThread);&#xA;&#xA;    camera1.join();&#xA;    camera2.join();&#xA;    infer_thread.join();&#xA;&#xA;    // 释放资源&#xA;    if (pipe_s1) pclose(pipe_s1);&#xA;    if (pipe_s2) pclose(pipe_s2);&#xA;&#xA;    return 0;&#xA;}&#xA;&#xA;</bool></queue></mutex></atomic></thread></iostream>

    &#xA;

  • FFmpeg.AutoGen C# library Can't open Codec G726

    8 septembre 2024, par Rushdi Eskandar

    I am stuck with FFmpeg.AutoGen G726 Audio codec, it always shows error invalid argument.&#xA;Note that I Tried other codecs such as G722, G711 and it is working fine except for G726 codec. I also confirm that my binaries does support G726 codec using this command ffmpeg -formats. Please tell me what could be the reason, and if you know any other library for decoding G726 that would be better

    &#xA;

    public unsafe class AudioDecoder : IDisposable&#xA; {&#xA;   private AVCodecContext* _codecContext;&#xA;   private AVCodec* _codec;&#xA;   private AVFrame* _frame;&#xA;   private AVPacket* _packet;&#xA;&#xA;   public AudioDecoder()&#xA;   {&#xA;       // Find the G726 decoder&#xA;       _codec = ffmpeg.avcodec_find_decoder(AVCodecID.AV_CODEC_ID_ADPCM_G726);&#xA;       if (_codec == null)&#xA;       {&#xA;           throw new Exception("G726 codec not found.");&#xA;       }&#xA;&#xA;       // Allocate codec context&#xA;       _codecContext = ffmpeg.avcodec_alloc_context3(_codec);&#xA;       if (_codecContext == null)&#xA;       {&#xA;           throw new Exception("Failed to allocate codec context.");&#xA;       }&#xA;&#xA;       // Print supported sample formats&#xA;       Console.WriteLine("Supported sample formats for G726 codec:");&#xA;       AVSampleFormat* sample_fmts = _codec->sample_fmts;&#xA;       if (sample_fmts != null)&#xA;       {&#xA;           while (*sample_fmts != AVSampleFormat.AV_SAMPLE_FMT_NONE)&#xA;           {&#xA;               Console.WriteLine($"Sample format: {*sample_fmts}");&#xA;               sample_fmts&#x2B;&#x2B;;&#xA;           }&#xA;       }&#xA;&#xA;       // Set codec parameters&#xA;       _codecContext->sample_rate = 8000;  // G726 typically uses 8000Hz&#xA;       if (_codec->sample_fmts != null)&#xA;       {&#xA;           _codecContext->sample_fmt = *_codec->sample_fmts;  // Use the first supported sample format&#xA;       }&#xA;       else&#xA;       {&#xA;           _codecContext->sample_fmt = AVSampleFormat.AV_SAMPLE_FMT_S16;  // Fallback to a common format&#xA;       }&#xA;       _codecContext->bit_rate = 32000;  // Example bitrate for G726&#xA;&#xA;       // Attempt to open the codec with detailed error logging&#xA;       int ret = ffmpeg.avcodec_open2(_codecContext, _codec, null);&#xA;       if (ret &lt; 0)&#xA;       {&#xA;           byte[] errBuf = new byte[1024];&#xA;           fixed (byte* errPtr = errBuf)&#xA;           {&#xA;               ffmpeg.av_strerror(ret, errPtr, (ulong)errBuf.Length);&#xA;           }&#xA;           string errMessage = System.Text.Encoding.UTF8.GetString(errBuf);&#xA;           throw new Exception($"Failed to open codec (Error code: {ret}): {errMessage}");&#xA;       }&#xA;&#xA;       // Allocate packet and frame&#xA;       _packet = ffmpeg.av_packet_alloc();&#xA;       _frame = ffmpeg.av_frame_alloc();&#xA;       if (_packet == null || _frame == null)&#xA;       {&#xA;           throw new Exception("Failed to allocate packet or frame.");&#xA;       }&#xA;   }&#xA;}&#xA;

    &#xA;