
Recherche avancée
Médias (1)
-
Richard Stallman et le logiciel libre
19 octobre 2011, par
Mis à jour : Mai 2013
Langue : français
Type : Texte
Autres articles (69)
-
MediaSPIP v0.2
21 juin 2013, parMediaSPIP 0.2 est la première version de MediaSPIP stable.
Sa date de sortie officielle est le 21 juin 2013 et est annoncée ici.
Le fichier zip ici présent contient uniquement les sources de MediaSPIP en version standalone.
Comme pour la version précédente, 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 (...) -
Mise à disposition des fichiers
14 avril 2011, parPar défaut, lors de son initialisation, MediaSPIP ne permet pas aux visiteurs de télécharger les fichiers qu’ils soient originaux ou le résultat de leur transformation ou encodage. Il permet uniquement de les visualiser.
Cependant, il est possible et facile d’autoriser les visiteurs à avoir accès à ces documents et ce sous différentes formes.
Tout cela se passe dans la page de configuration du squelette. Il vous faut aller dans l’espace d’administration du canal, et choisir dans la navigation (...) -
Librairies et logiciels spécifiques aux médias
10 décembre 2010, parPour un fonctionnement correct et optimal, plusieurs choses sont à prendre en considération.
Il est important, après avoir installé apache2, mysql et php5, d’installer d’autres logiciels nécessaires dont les installations sont décrites dans les liens afférants. Un ensemble de librairies multimedias (x264, libtheora, libvpx) utilisées pour l’encodage et le décodage des vidéos et sons afin de supporter le plus grand nombre de fichiers possibles. Cf. : ce tutoriel ; FFMpeg avec le maximum de décodeurs et (...)
Sur d’autres sites (13579)
-
How to extract subtitle from usm file
14 janvier 2024, par Marcin NancinI would like to extract subtitle.txt from usm file, I tried use ffmpeg but it show unspuported file. Hexedit show that file has txt extension. Ffmpeg support demux cri usm file, but I cant figure out how to do it.


Duration: 00:03:10.00, start: 0.000000, bitrate: 12383 kb/s
 Stream #0:0: Video: mpeg1video, yuv420p(tv, progressive), 1280x720 [SAR 1:1 DAR 16:9], 104857 kb/s, 30 fps, 30 tbr, 30 tbn
 Side data:
 cpb: bitrate max/min/avg: 0/0/0 buffer size: 4554752 vbv_delay: N/A
 Stream #0:1: Audio: none, 44100 Hz, 2 channels
 Stream #0:2: Audio: none, 44100 Hz, 2 channels
 Stream #0:3: Audio: none, 44100 Hz, 2 channels
 Stream #0:4: Audio: none, 44100 Hz, 2 channels
 Stream #0:5: Audio: none, 44100 Hz, 2 channels
 Stream #0:6: Audio: none, 44100 Hz, 2 channels
 Stream #0:7: Audio: none, 44100 Hz, 2 channels
 Stream #0:8: Audio: none, 44100 Hz, 2 channels
 Stream #0:9: Audio: none, 44100 Hz, 2 channels
 Stream #0:10: Audio: none, 44100 Hz, 2 channels
 Stream #0:11: Subtitle: none
At least one output file must be specified



I tried to unpack the file but I still get an error that the codec was not detected.


-
ffmpeg encoding leaves me with blank space at the end where the video pauses and there is nothing ahead
6 novembre 2022, par Nisarg DesaiI was trying to slice some of the video being played and clip it in mpv.net using a .lua script which uses ffmpeg to encode the webm output. ffmpeg sometimes leaves some seconds blank and without any video/audio ahead while clipping from source. Is there any solution to this ?


The code for the script is given below (was taken from here https://github.com/occivink/mpv-scripts) :


local utils = require "mp.utils"
local msg = require "mp.msg"
local options = require "mp.options"

local ON_WINDOWS = (package.config:sub(1,1) ~= "/")

local start_timestamp = nil
local profile_start = ""

-- implementation detail of the osd message
local timer = nil
local timer_duration = 2

-- folder creation if it doesnt exist
function exists(file)
 local ok, err, code = os.rename(file, file)
 if not ok then
 if code == 13 then
 return true
 end
 end
 return ok, err
end

--- Check if a directory exists in this path
function create_dir(path)
 local dir = "\"" .. path .. "\""
 if not exists(path .."/") then
 os.execute("mkdir " .. dir)
 end
end

function append_table(lhs, rhs)
 for i = 1,#rhs do
 lhs[#lhs+1] = rhs[i]
 end
 return lhs
end

function file_exists(name)
 local f = io.open(name, "r")
 if f ~= nil then
 io.close(f)
 return true
 else
 return false
 end
end

function get_extension(path)
 local candidate = string.match(path, "%.([^.]+)$")
 if candidate then
 for _, ext in ipairs({ "mkv", "webm", "mp4", "avi" }) do
 if candidate == ext then
 return candidate
 end
 end
 end
 return "mkv"
end

function get_output_string(dir, format, input, extension, title, from, to, profile)
 local res = utils.readdir(dir)
 if not res then
 return nil
 end
 local files = {}
 for _, f in ipairs(res) do
 files[f] = true
 end
 local output = format
 output = string.gsub(output, "$f", function() return input end)
 output = string.gsub(output, "$t", function() return title end)
 output = string.gsub(output, "$s", function() return seconds_to_time_string(from, true) end)
 output = string.gsub(output, "$e", function() return seconds_to_time_string(to, true) end)
 output = string.gsub(output, "$d", function() return seconds_to_time_string(to-from, true) end)
 output = string.gsub(output, "$x", function() return extension end)
 output = string.gsub(output, "$p", function() return profile end)
 if ON_WINDOWS then
 output = string.gsub(output, "[/\\|<>?:\"*]", "_")
 end
 if not string.find(output, "$n") then
 return files[output] and nil or output
 end
 local i = 1
 while true do
 local potential_name = string.gsub(output, "$n", tostring(i))
 if not files[potential_name] then
 return potential_name
 end
 i = i + 1
 end
end

function get_video_filters()
 local filters = {}
 for _, vf in ipairs(mp.get_property_native("vf")) do
 local name = vf["name"]
 name = string.gsub(name, '^lavfi%-', '')
 local filter
 if name == "crop" then
 local p = vf["params"]
 filter = string.format("crop=%d:%d:%d:%d", p.w, p.h, p.x, p.y)
 elseif name == "mirror" then
 filter = "hflip"
 elseif name == "flip" then
 filter = "vflip"
 elseif name == "rotate" then
 local rotation = vf["params"]["angle"]
 -- rotate is NOT the filter we want here
 if rotation == "90" then
 filter = "transpose=clock"
 elseif rotation == "180" then
 filter = "transpose=clock,transpose=clock"
 elseif rotation == "270" then
 filter = "transpose=cclock"
 end
 end
 filters[#filters + 1] = filter
 end
 return filters
end

function get_input_info(default_path, only_active)
 local accepted = {
 video = true,
 audio = not mp.get_property_bool("mute"),
 sub = mp.get_property_bool("sub-visibility")
 }
 local ret = {}
 for _, track in ipairs(mp.get_property_native("track-list")) do
 local track_path = track["external-filename"] or default_path
 if not only_active or (track["selected"] and accepted[track["type"]]) then
 local tracks = ret[track_path]
 if not tracks then
 ret[track_path] = { track["ff-index"] }
 else
 tracks[#tracks + 1] = track["ff-index"]
 end
 end
 end
 return ret
end

function seconds_to_time_string(seconds, full)
 local ret = string.format("%02d:%02d.%03d"
 , math.floor(seconds / 60) % 60
 , math.floor(seconds) % 60
 , seconds * 1000 % 1000
 )
 if full or seconds > 3600 then
 ret = string.format("%d:%s", math.floor(seconds / 3600), ret)
 end
 return ret
end

function start_encoding(from, to, settings)
 local args = {
 settings.ffmpeg_command,
 "-loglevel", "panic", "-hide_banner",
 }
 local append_args = function(table) args = append_table(args, table) end

 local path = mp.get_property("path")
 local is_stream = not file_exists(path)
 if is_stream then
 path = mp.get_property("stream-path")
 end

 local track_args = {}
 local start = seconds_to_time_string(from, false)
 local input_index = 0
 for input_path, tracks in pairs(get_input_info(path, settings.only_active_tracks)) do
 append_args({
 "-ss", start,
 "-i", input_path,
 })
 if settings.only_active_tracks then
 for _, track_index in ipairs(tracks) do
 track_args = append_table(track_args, { "-map", string.format("%d:%d", input_index, track_index)})
 end
 else
 track_args = append_table(track_args, { "-map", tostring(input_index)})
 end
 input_index = input_index + 1
 end

 append_args({"-to", tostring(to-from)})
 append_args(track_args)

 -- apply some of the video filters currently in the chain
 local filters = {}
 if settings.preserve_filters then
 filters = get_video_filters()
 end
 if settings.append_filter ~= "" then
 filters[#filters + 1] = settings.append_filter
 end
 if #filters > 0 then
 append_args({ "-filter:v", table.concat(filters, ",") })
 end

 -- split the user-passed settings on whitespace
 for token in string.gmatch(settings.codec, "[^%s]+") do
 args[#args + 1] = token
 end

 -- path of the output
 local output_directory = mp.get_property("options/screenshot-directory")
 -- local checkbool = exists(output_directory.."/")
 -- mp.osd_message("" .. type(checkbool), timer_duration)
 -- if not checkbool then 
 -- os.execute("mkdir" .. output_directory)
 -- end
 if output_directory == "" then
 if is_stream then
 output_directory = "."
 else
 output_directory, _ = utils.split_path(path)
 end
 else
 output_directory = string.gsub(output_directory, "^~", os.getenv("HOME") or "~")
 end
 local input_name = mp.get_property("filename/no-ext") or "encode"
 local title = mp.get_property("media-title")
 local extension = get_extension(path)
 local output_name = get_output_string(output_directory, settings.output_format, input_name, extension, title, from, to, settings.profile)
 if not output_name then
 mp.osd_message("Invalid path " .. output_directory)
 return
 end
 args[#args + 1] = utils.join_path(output_directory, output_name)

 if settings.print then
 local o = ""
 -- fuck this is ugly
 for i = 1, #args do
 local fmt = ""
 if i == 1 then
 fmt = "%s%s"
 elseif i >= 2 and i <= 4 then
 fmt = "%s"
 elseif args[i-1] == "-i" or i == #args or args[i-1] == "-filter:v" then
 fmt = "%s '%s'"
 else
 fmt = "%s %s"
 end
 o = string.format(fmt, o, args[i])
 end
 print(o)
 end
 if settings.detached then
 utils.subprocess_detached({ args = args })
 else
 local res = utils.subprocess({ args = args, max_size = 0, cancellable = false })
 if res.status == 0 then
 mp.osd_message("Finished encoding succesfully")
 else
 mp.osd_message("Failed to encode, check the log")
 end
 end
end

function clear_timestamp()
 timer:kill()
 start_timestamp = nil
 profile_start = ""
 mp.remove_key_binding("encode-ESC")
 mp.remove_key_binding("encode-ENTER")
 mp.osd_message("", 0)
end

function set_timestamp(profile)
 if not mp.get_property("path") then
 mp.osd_message("No file currently playing")
 return
 end
 if not mp.get_property_bool("seekable") then
 mp.osd_message("Cannot encode non-seekable media")
 return
 end
 create_dir(mp.get_property("options/screenshot-directory"))
 if not start_timestamp or profile ~= profile_start then
 profile_start = profile
 start_timestamp = mp.get_property_number("time-pos")
 local msg = function()
 mp.osd_message(
 string.format("encode [%s]: waiting for end timestamp", profile or "default"),
 timer_duration
 )
 end
 msg()
 timer = mp.add_periodic_timer(timer_duration, msg)
 mp.add_forced_key_binding("ESC", "encode-ESC", clear_timestamp)
 mp.add_forced_key_binding("ENTER", "encode-ENTER", function() set_timestamp(profile) end)
 else
 local from = start_timestamp
 local to = mp.get_property_number("time-pos")
 if to <= from then
 mp.osd_message("Second timestamp cannot be before the first", timer_duration)
 timer:kill()
 timer:resume()
 return
 end
 clear_timestamp()
 mp.osd_message(string.format("Encoding from %s to %s"
 , seconds_to_time_string(from, false)
 , seconds_to_time_string(to, false)
 ), timer_duration)
 -- include the current frame into the extract
 local fps = mp.get_property_number("container-fps") or 30
 to = to + 1 / fps / 2
 local settings = {
 detached = false,
 container = "",
 only_active_tracks = false,
 preserve_filters = true,
 append_filter = "",
 codec = "-c:v libvpx-vp9 -lossless 1 -b:v 1000k -deadline good",
 output_format = "$f_$n.webm",
 output_directory = "",
 ffmpeg_command = "ffmpeg",
 print = true,
 }
 if profile then
 options.read_options(settings, profile)
 if settings.container ~= "" then
 msg.warn("The 'container' setting is deprecated, use 'output_format' now")
 settings.output_format = settings.output_format .. "." .. settings.container
 end
 settings.profile = profile
 else
 settings.profile = "default"
 end 
 start_encoding(from, to, settings)
 end
end

mp.add_key_binding(nil, "set-timestamp", set_timestamp)



-
ffmpeg c/c++ get frame count or timestamp and fps
23 juin 2016, par broschbI am using ffmpeg to decode a video file in C. I am struggling to get either the count of the current frame I am decoding or the timestamp of the frame. I have read numerous posts that show how to calculate an estimated frame no based on the fps and frame timestamp, however I am not able to get either of those.
What I need : fps of video file, timestamp of current frame or frame no(not calculated)
What I have : I am able to get the time of the video using
pFormatCtx->duration/AV_TIME_BASE
I am counting the frames currently as I process them, and getting a current frame count, this is not going to work longterm though. I can get the total frame count for the file using
pFormatCtx->streams[currentStream->videoStream]->nb_frames
I have read this may not work for all streams, although it has worked for every stream I have tried.
I have tried using the time_base.num and time_base.den values and packet.pts, but I can’t make any sense of the values that I am getting from those, so I may just need to understand better what those values are.
Does anyone know of resources that show examples on how to get this values ?