
Recherche avancée
Autres articles (93)
-
Ecrire une actualité
21 juin 2013, parPrésentez les changements dans votre MédiaSPIP ou les actualités de vos projets sur votre MédiaSPIP grâce à la rubrique actualités.
Dans le thème par défaut spipeo de MédiaSPIP, les actualités sont affichées en bas de la page principale sous les éditoriaux.
Vous pouvez personnaliser le formulaire de création d’une actualité.
Formulaire de création d’une actualité Dans le cas d’un document de type actualité, les champs proposés par défaut sont : Date de publication ( personnaliser la date de publication ) (...) -
Publier sur MédiaSpip
13 juin 2013Puis-je poster des contenus à partir d’une tablette Ipad ?
Oui, si votre Médiaspip installé est à la version 0.2 ou supérieure. Contacter au besoin l’administrateur de votre MédiaSpip pour le savoir -
Websites made with MediaSPIP
2 mai 2011, parThis page lists some websites based on MediaSPIP.
Sur d’autres sites (6158)
-
ffmpeg_opt : fix max_error_rate help info display issue.
23 février 2018, par Jun Zhaoffmpeg_opt : fix max_error_rate help info display issue.
ffmpeg -h display "max_error_rate" option help information have
been cut off, the root cause is used a wrong initial order.Signed-off-by : Jun Zhao <jun.zhao@intel.com>
Signed-off-by : Michael Niedermayer <michael@niedermayer.cc> -
How can I get info immediately when I use ffprobe
6 février 2018, par roomyI want to get some info about live stream.
I use
ffprobe -i rtmp://****.
(ffmpeg -i http://****
) also can’t get info immediately.for some live stream,I can get some info immediately.
like this :Input #0, flv, from 'http://hdl.9158.com/live/2f6c6ce0162f6af2cccadf289dfa9674.flv':
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0: Subtitle: text
Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp
Stream #0:2: Video: h264 (Main), yuv420p(progressive), 540x960, 20 fps, 20 tbr, 1k tbnbut
sometimes I can’t get info until 2mins later, although the live stream has no problem.how can I solve this problem.
use
ffprobe -analyzeduration 500k -probesize 100k -i rtmp://***
can solve the problem.
but then I run command to merge live streams I checked alive before.ffmpeg -analyzeduration 500k -i http://flv80f29ef7.live.126.net/live/8c79ace747b24694a8d6563c9e626509.flv -analyzeduration 500k -i http://flv80f29ef7.live.126.net/live/8c79ace747b24694a8d6563c9e626509.flv -analyzeduration 500k -i http://flv80f29ef7.live.126.net/live/8c79ace747b24694a8d6563c9e626509.flv -analyzeduration 500k -i http://flv80f29ef7.live.126.net/live/8c79ace747b24694a8d6563c9e626509.flv -filter_complex "nullsrc=size=640x480 [base]; [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft]; [base][upperleft] overlay=shortest=1 [tmp1];[tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=240 " -f flv rtmp://127.0.0.1:1935/live
calls error :
Stream specifier ':v' in filtergraph description nullsrc=size=640x480 [base];[0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft];[1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright];[2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft];[3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright];[base][upperleft] overlay=shortest=1 [tmp1];[tmp1][upperright] overlay=shortest=1:x=320 [tmp2];[tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3];[tmp3][lowerright] overlay=shortest=1:x=320:y=240 matches no streams.
-
use AVMutableVideoComposition rotate video after ffmpge can't get rotate info
29 janvier 2018, par ladengbefore the video is not rotated, I can use FFmpeg command get rotate information, command like this :
ffprobe -v quiet -print_format json -show_format -show_streams recordVideo.mp4
or
ffmpeg -i recordVideo.mp4.
when I use AVMutableVideoComposition rotate video, the video lost video rotate information, rotate video simple : RoatetVideoSimpleCode,
code below :-(void)performWithAsset:(AVAsset*)asset complateBlock:(void(^)(void))complateBlock{
AVMutableComposition *mutableComposition;
AVMutableVideoComposition *mutableVideoComposition;
cacheRotateVideoURL = [[NSURL alloc] initFileURLWithPath:[NSString pathWithComponents:@[NSTemporaryDirectory(), kCacheCertVideoRotate]]];
AVMutableVideoCompositionInstruction *instruction = nil;
AVMutableVideoCompositionLayerInstruction *layerInstruction = nil;
CGAffineTransform t1;
CGAffineTransform t2;
AVAssetTrack *assetVideoTrack = nil;
AVAssetTrack *assetAudioTrack = nil;
// Check if the asset contains video and audio tracks
if ([[asset tracksWithMediaType:AVMediaTypeVideo] count] != 0) {
assetVideoTrack = [asset tracksWithMediaType:AVMediaTypeVideo][0];
}
if ([[asset tracksWithMediaType:AVMediaTypeAudio] count] != 0) {
assetAudioTrack = [asset tracksWithMediaType:AVMediaTypeAudio][0];
}
CMTime insertionPoint = kCMTimeZero;
NSError *error = nil;
// CGAffineTransform rotateTranslate;
// Step 1
// Create a composition with the given asset and insert audio and video tracks into it from the asset
if (!mutableComposition) {
// Check whether a composition has already been created, i.e, some other tool has already been applied
// Create a new composition
mutableComposition = [AVMutableComposition composition];
// Insert the video and audio tracks from AVAsset
if (assetVideoTrack != nil) {
AVMutableCompositionTrack *compositionVideoTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [asset duration]) ofTrack:assetVideoTrack atTime:insertionPoint error:&error];
}
if (assetAudioTrack != nil) {
AVMutableCompositionTrack *compositionAudioTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [asset duration]) ofTrack:assetAudioTrack atTime:insertionPoint error:&error];
}
}
// Step 2
// Translate the composition to compensate the movement caused by rotation (since rotation would cause it to move out of frame)
// t1 = CGAffineTransformMakeTranslation(assetVideoTrack.naturalSize.height, 0.0);
// Rotate transformation
// t2 = CGAffineTransformRotate(t1, degreesToRadians(90.0));
CGFloat degrees = 90;
//--
if (degrees != 0) {
// CGAffineTransform mixedTransform;
if(degrees == 90){
//90°
t1 = CGAffineTransformMakeTranslation(assetVideoTrack.naturalSize.height,0.0);
t2 = CGAffineTransformRotate(t1,M_PI_2);
}else if(degrees == 180){
//180°
t1 = CGAffineTransformMakeTranslation(assetVideoTrack.naturalSize.width, assetVideoTrack.naturalSize.height);
t2 = CGAffineTransformRotate(t1,M_PI);
}else if(degrees == 270){
//270°
t1 = CGAffineTransformMakeTranslation(0.0, assetVideoTrack.naturalSize.width);
t2 = CGAffineTransformRotate(t1,M_PI_2*3.0);
}
}
// Step 3
// Set the appropriate render sizes and rotational transforms
if (!mutableVideoComposition) {
// Create a new video composition
mutableVideoComposition = [AVMutableVideoComposition videoComposition];
mutableVideoComposition.renderSize = CGSizeMake(assetVideoTrack.naturalSize.height,assetVideoTrack.naturalSize.width);
mutableVideoComposition.frameDuration = CMTimeMake(1, 30);
// The rotate transform is set on a layer instruction
instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, [mutableComposition duration]);
layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:(mutableComposition.tracks)[0]];
[layerInstruction setTransform:t2 atTime:kCMTimeZero];
// [layerInstruction setTransform:rotateTranslate atTime:kCMTimeZero];
} else {
mutableVideoComposition.renderSize = CGSizeMake(mutableVideoComposition.renderSize.height, mutableVideoComposition.renderSize.width);
// Extract the existing layer instruction on the mutableVideoComposition
instruction = (mutableVideoComposition.instructions)[0];
layerInstruction = (instruction.layerInstructions)[0];
// Check if a transform already exists on this layer instruction, this is done to add the current transform on top of previous edits
CGAffineTransform existingTransform;
if (![layerInstruction getTransformRampForTime:[mutableComposition duration] startTransform:&existingTransform endTransform:NULL timeRange:NULL]) {
[layerInstruction setTransform:t2 atTime:kCMTimeZero];
} else {
// Note: the point of origin for rotation is the upper left corner of the composition, t3 is to compensate for origin
CGAffineTransform t3 = CGAffineTransformMakeTranslation(-1*assetVideoTrack.naturalSize.height/2, 0.0);
CGAffineTransform newTransform = CGAffineTransformConcat(existingTransform, CGAffineTransformConcat(t2, t3));
[layerInstruction setTransform:newTransform atTime:kCMTimeZero];
}
}
// Step 4
// Add the transform instructions to the video composition
instruction.layerInstructions = @[layerInstruction];
mutableVideoComposition.instructions = @[instruction];
//write video
if ([[NSFileManager defaultManager] fileExistsAtPath:cacheRotateVideoURL.path]) {
NSError *error = nil;
BOOL removeFlag = [[NSFileManager defaultManager] removeItemAtURL:cacheRotateVideoURL error:&error];
SPLog(@"remove rotate file:%@ %@",cacheRotateVideoURL.path,removeFlag?@"Success":@"Failed");
}
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetMediumQuality] ;
exportSession.outputURL = cacheRotateVideoURL;
exportSession.outputFileType = AVFileTypeMPEG4;
exportSession.videoComposition = mutableVideoComposition;
exportSession.shouldOptimizeForNetworkUse = YES;
exportSession.timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration);
[exportSession exportAsynchronouslyWithCompletionHandler:^{
SPLog(@"cache write done");
AVAsset* asset = [AVURLAsset URLAssetWithURL: cacheRotateVideoURL options:nil];
SPLog(@"rotate recrod video time: %lf",CMTimeGetSeconds(asset.duration));
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeVideoAtPathToSavedPhotosAlbum:cacheRotateVideoURL
completionBlock:^(NSURL *assetURL, NSError *error) {
if (error) {
NSLog(@"Save video fail:%@",error);
} else {
NSLog(@"Save video succeed.");
}
}];
complateBlock();
}];}
can anyone tell me why this is so?
how can I write rotate information when I rotate the video ?