একটি লুপে ffmpeg ব্যবহার করার সময় অদ্ভুত ত্রুটি


23

আমার একটি বাশ স্ক্রিপ্ট একটি ফলাফলের মধ্য দিয়ে লুপিং করছে এবং কিছু এফএলভি ফাইলের একটি এফএফপিপিগ এনকোডিং করছে। স্ক্রিপ্টটি চলতে থাকলেও ffmpeg আউটপুটটি ইন্টারুপ্টেড বলে মনে হচ্ছে এবং নীচের মত কিছু অদ্ভুত ত্রুটিযুক্ত আউটপুট আউটপুট করছে। আমি জানি না যে এখানে কী চলছে। কেউ কি আমাকে সঠিক দিকে নির্দেশ করতে পারে?

এটি লুপটি এখনও চলছে যখন এটি হওয়া উচিত নয় এবং ffmpeg প্রক্রিয়াটি ইন্টারপুট করা উচিত।

নির্দিষ্ট ত্রুটিটি হ'ল:

frame=   68 fps= 67 q=28.0 00000000000000000000000000001000size=      22kB time=00:00:00.50 bitrate= 363.2kbits/s dup=1 drop=0    
Enter command: <target> <time> <command>[ <argument>]
Parse error, at least 3 arguments were expected, only 1 given in string 'om/pt_br/nx/R3T4N2_HD3D_demoCheckedOut.flv'

Ffmpeg আউটপুট থেকে আরও কিছু বিশদ:

[buffer @ 0xa30e1e0] w:800 h:600 pixfmt:yuv420p tb:1/1000000 sar:0/1 sws_param:flags=2
[libx264 @ 0xa333240] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.1 Cache64
[libx264 @ 0xa333240] profile High, level 3.1
[libx264 @ 0xa333240] 264 - core 122 r2184 5c85e0a - H.264/MPEG-4 AVC codec - Copyleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=5 deblock=1:0:0 analyse=0x3:0x113 me=umh subme=8 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=2 b_bias=0 direct=3 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=50 rc=cbr mbtree=1 bitrate=500 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 vbv_maxrate=500 vbv_bufsize=1000 nal_hrd=none ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to './mp4s/pt_br/teamcenter/tc8_interactive/videos/8_SRM_EN.mp4':
  Metadata:
    audiodelay      : 0
    canSeekToEnd    : true
    encoder         : Lavf54.3.100
    Stream #0:0: Video: h264 (![0][0][0] / 0x0021), yuv420p, 800x600, q=-1--1, 500 kb/s, 30k tbn, 29.97 tbc
    Stream #0:1: Audio: aac (@[0][0][0] / 0x0040), 44100 Hz, mono, s16, 128 kb/s
Stream mapping:
  Stream #0:1 -> #0:0 (vp6f -> libx264)
  Stream #0:0 -> #0:1 (mp3 -> libfaac)
Press [q] to stop, [?] for help
error parsing debug value0 00000000000000000000000000000000size=      13kB time=00:00:00.-3 bitrate=-3165.5kbits/s dup=1 drop=0    
debug=0
frame=   68 fps= 67 q=28.0 00000000000000000000000000001000size=      22kB time=00:00:00.50 bitrate= 363.2kbits/s dup=1 drop=0    
Enter command: <target> <time> <command>[ <argument>]
Parse error, at least 3 arguments were expected, only 1 given in string 'om/pt_br/nx/R3T4N2_HD3D_demoCheckedOut.flv'

লিপিটি নিম্নরূপ

#!/bin/bash
LOGFILE=encodemp4ize.log
echo '' > $LOGFILE
STARTTIME=date
echo "Started at `$STARTTIME`" >> $LOGFILE
rsync -avz flvs/ mp4s/ --exclude '*.flv'
#find flvs/ -name "*.flv" > flv-files
# The loop
find flvs/ -name "*.flv" | while read f
do
FILENAME=`echo $f | sed 's#flvs/##'`
MP4FILENAME=`echo $FILENAME | sed 's#.flv#.mp4#'`
ffmpeg -i "$f" -vcodec libx264 -vprofile high -preset slow -b:v 500k -maxrate 500k -bufsize 1000k -threads 0 -acodec libfaac -ab 128k "./mp4s/$MP4FILENAME"
echo "$f MP4 done" >> $LOGFILE
done

আমি কোনও স্ক্রিপ্টারের বেশি নই, তবে একটি সুস্পষ্ট পরামর্শ - আপনার স্ক্রিপ্টটি এটি চালাচ্ছে এমন রেখাগুলি মুদ্রণ করে দিন। তারা আপনাকে যা বলে মনে হয় তা নাও হতে পারে।
ফাহিম মিঠা

পার্শ্ব ইস্যু হিসাবে: mp4filename=$(basename "$f" mp4)দরকারী হতে পারে (দেখুন man basenameএবং man dirnameআরও তথ্যের জন্য)
পিটার.ও

bash -x myscriptসমস্ত ভেরিয়েবল প্রসারিত করে স্ক্রিপ্টের প্রয়োগের একটি লাইন বাই লাইন ট্রেস পেতে বলুন । ওহ, এবং ঘটনাক্রমে, আপনি লাইনের basenameচাকাটি পুনরায় সজ্জিত করেছেন FILENAME=। :)
ওয়ারেন ইয়ং

1
আমি সমাধান খুঁজে পেয়েছি। বাশ স্ক্রিপ্টটি পণ্যের ইনপুট (যথা 'সি' কী) বলে মনে হচ্ছে যা ffmpeg প্রক্রিয়াটিতে হস্তক্ষেপ করে। "</ Dev / null" টি এফফেম্পেগের মতো পাইপ করা হচ্ছে: ffmpeg -i "./$f" -vcodec libx264 -vprofile উচ্চ-প্রসেট ধীর-বি: v 500 কে-ম্যাক্স্রেট 500 কে -ফুসাইজ 1000 কে-থ্রেড 0 -কোডেক লাইবফ্যাক -ab 128 কে "./mp4s/$MP4FILENAME" </ dev / নাল সমস্যাটি সমাধান করে। [ linuxquestions.org/questions/programming-9/… [1] এর মাধ্যমে : linuxquestions.org/questions/pogramming-9/…
মার্ক উইলিয়ামস

উত্তর:


56

আপনার প্রশ্নটি আসলে বাশ এফকিউ # 89 : এর স্ট্যান্ডার্ড ইনপুটটি পড়তে </dev/nullবাধা দেওয়ার জন্য কেবল যুক্ত ffmpegকরুন।


আমি আপনার স্ক্রিপ্ট ঠিক করার স্বাধীনতা নিয়েছি কারণ এতে সম্ভাব্য ত্রুটি রয়েছে। কয়েকটি গুরুত্বপূর্ণ বিষয়:

  • ফাইলের নামগুলি হ্যান্ডেল করার জন্য জটিল, কারণ বেশিরভাগ ফাইলসিস্টেমগুলি এটিকে সমস্ত প্রকারের মুদ্রণযোগ্য অক্ষরগুলিকে ধারণ করতে দেয় যা সাধারণ মানুষ আবর্জনা হিসাবে দেখতে পাবে। সরলকরণ অনুমান করা যেমন "ফাইলের নামগুলিতে কেবল 'সাধারণ' অক্ষর থাকে" এর ফলে ভঙ্গুর শেল স্ক্রিপ্টগুলি উপস্থিত হয়"সাধারণ" ফাইলের নামগুলিতে কাজ করতে এবং তারপরে যে দিনটিকে তারা বিশেষ করে দুষ্টু ফাইল নামে চালিত করে যা স্ক্রিপ্টের অনুমানগুলি অনুসরণ করে না। অন্যদিকে, ফাইলের নামগুলি সঠিকভাবে পরিচালনা করা এমন বিরক্তিকর হতে পারে যে কোনও অদ্ভুত ফাইলের নামের মুখোমুখি হওয়ার সম্ভাবনা শূন্যের কাছাকাছি হওয়ার প্রত্যাশা করা হয় (যেমন আপনি কেবল নিজের ফাইলগুলিতে স্ক্রিপ্ট ব্যবহার করেন এবং আপনি নিজের ফাইলগুলিকে "সাধারণ" নাম দিন)। কখনও কখনও ফাইলের নাম মোটেও পার্স না করে পুরোপুরি এই সিদ্ধান্তটি এড়ানো সম্ভব হয়। সৌভাগ্যবসত, যে সম্ভব find(1)'র -execবিকল্প। কেবল {}যুক্তিটি লিখুন -execএবং findআউটপুট পার্সিংয়ের বিষয়ে আপনাকে চিন্তা করতে হবে না ।

  • ব্যবহার sedবা অন্যান্য বাহ্যিক প্রসেস stripping এক্সটেনশন এবং উপসর্গ মত সহজ স্ট্রিং অপারেশন করতে অদক্ষ হয়। পরিবর্তে, পরামিতি বিস্তৃতি ব্যবহার করুন যা শেলের অংশ (কোনও বাহ্যিক প্রক্রিয়া মানে এটি দ্রুত হবে না)। বিষয় সম্পর্কে কিছু সহায়ক নিবন্ধ নীচে তালিকাভুক্ত করা হয়েছে:

  • ব্যবহার করুন $( ), এবং ``আর ব্যবহার করবেন না: বাশ FAQ 82

  • UPPERCASE ভেরিয়েবল নাম ব্যবহার করা এড়িয়ে চলুন। সেই নামস্থানটি শেল দ্বারা সাধারণত বিশেষ উদ্দেশ্যে (যেমন PATH) সংরক্ষণ করা হয়, সুতরাং এটি আপনার নিজের ভেরিয়েবলের জন্য ব্যবহার করা একটি খারাপ ধারণা।

এবং এখন, আরও পদক্ষেপ ছাড়াই, আপনার জন্য এখানে একটি পরিষ্কার স্ক্রিপ্ট দেওয়া হয়েছে:

#!/bin/sh

logfile=encodemp4ize.log
echo "Started at $(date)." > "$logfile"
rsync -avz --exclude '*.flv' flvs/ mp4s/

find flvs/ -type f -name '*.flv' -exec sh -c '
for flvsfile; do
    file=${flvsfile#flvs/}
    < /dev/null ffmpeg -i "$flvsfile" -vcodec libx264 -vprofile high \
        -preset slow -b:v 500k -maxrate 500k -bufsize 1000k \
        -threads 0 -acodec libfaac -ab 128k \
        "mp4s/${file%flv}"mp4
    printf %s\\n "$flvsfile MP4 done." >> "$logfile"
done
' _ {} +

দ্রষ্টব্য: আমি পসিএক্স ব্যবহার করেছি shকারণ আপনি bashআপনার মূলটিতে কোনও বিশেষ বৈশিষ্ট্য ব্যবহার করেন নি বা প্রয়োজন নেই ।


3
এটি একটি উজ্জ্বল উত্তর! সংশোধন স্ক্রিপ্ট লিখে চেষ্টা করার জন্য আপনাকে ধন্যবাদ। শুধু ভাবছি জিগ্রের জন্য গ্রেগের উইকি গাইডের সাথে মিল আছে কি? ধন্যবাদ!
আর্ট

1
@ আর্ট দুঃখিত, আমি এ সম্পর্কে খুব বেশি জানি না zsh। হয়তো সাইটের কিছু zsh লোক জানতে পারে।
jw013

সমস্যাটি হ'ল ffmpeg রূপান্তরিত ফাইলটির পূর্ববর্তী সংস্করণটি মুছতে হবে কিনা তা স্থির করে স্ক্রিপ্টটি পরে লিখে একটি ত্রুটি তৈরি করছে কিনা তা আমার পরীক্ষা করা দরকার। আমি একটি প্ল্লেক্স মিডিয়া সার্ভারের জন্য এমকেভি কে এমপি 4 এ রূপান্তর করছি। আমি বড় বড় এমকেভি ফাইল দিয়ে তোতলামি করেছি, তাই আমি সিদ্ধান্ত নিয়েছি যে সমস্ত এমকেভি এমপিপি তে রূপান্তর করব। আরেকটি সমস্যা হ'ল আমাকে ছবি ভিত্তিক ফর্ম্যাটগুলির জন্য সাবটাইটেল স্ট্রিম রূপান্তর ব্যর্থতা পরীক্ষা করতে হবে, সেক্ষেত্রে আমি সাবটি বের করার জন্য অন্য প্রসেস ব্যবহার করি। সুতরাং, আমি কীভাবে ffmpeg চালাব, এর আউটপুট পেতে পারি এবং এই সমস্যাটিতে না চলে?
দাকাবদী

15

আমি সমাধান খুঁজে পেয়েছি । বাশ স্ক্রিপ্টটি ইনপুট (যথা 'সি' কী) তৈরি করে বলে মনে হচ্ছে যা ffmpegপ্রক্রিয়াটিতে হস্তক্ষেপ করে।

যোগ করার পদ্ধতি < /dev/nullথেকে ffmpegকমান্ড লাইন, তাই পছন্দ:

ffmpeg -i "./$f" -vcodec libx264 -vprofile high -preset slow -b:v 500k -maxrate 500k -bufsize 1000k -threads 0 -acodec libfaac -ab 128k "./mp4s/$MP4FILENAME" < /dev/null

সমস্যা সমাধান করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.